zoj 2526(一道很好的最短路应用题)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1538
题意:最短路问题,但是要求出最短路的条数,同时要求出所有可能的最短路选择中javabean最多的情况。
思路:求到终点的最短路径用Dijkstra,其路径更新条件(如果到某个点有多个路径长度一样的最短路径,则选择豆子总数最多的)就是直接加个else if条件就搞定了,最后就是dfs搜一下最短路的条数了,这个我就记忆化了一下。
然后我一开始使用spfa写的,wa了好多次,orz...改成dijkstra就过了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 #include<vector> 6 using namespace std; 7 #define MAXN 555 8 #define inf 1<<30 9 /* 10 struct Node{ 11 int v,w; 12 }; 13 vector<Node>vet[MAXN]; 14 */ 15 int map[MAXN][MAXN]; 16 int path[MAXN]; 17 int dist[MAXN]; 18 int value[MAXN]; 19 int sum_value[MAXN]; 20 int dp[MAXN]; 21 int mark[MAXN]; 22 int n,m,st,ed; 23 24 /* 25 void SPFA(){ 26 memset(sum_value,0,sizeof(sum_value)); 27 memset(path,-1,sizeof(path)); 28 for(int i=0;i<n;i++)dist[i]=inf; 29 dist[st]=0,sum_value[st]=value[st]; 30 queue<int>Q; 31 Q.push(st); 32 while(!Q.empty()){ 33 int u=Q.front(); 34 Q.pop(); 35 for(int i=0;i<vet[u].size();i++){ 36 int v=vet[u][i].v; 37 int w=vet[u][i].w; 38 if(dist[u]+w<=dist[v]){ 39 path[v]=u; 40 Q.push(v); 41 if(dist[u]+w<dist[v]){ 42 dist[v]=dist[u]+w; 43 sum_value[v]=sum_value[u]+value[v]; 44 }else if(sum_value[v]<sum_value[u]+value[v]){ 45 sum_value[v]=sum_value[u]+value[v]; 46 } 47 } 48 } 49 } 50 } 51 */ 52 53 void Dijkstra(){ 54 memset(mark,false,sizeof(mark)); 55 memset(sum_value,0,sizeof(sum_value)); 56 memset(path,-1,sizeof(path)); 57 for(int i=0;i<n;i++)dist[i]=map[st][i]; 58 dist[st]=0,sum_value[st]=value[st],mark[st]=true; 59 int u=st; 60 for(int i=0;i<n-1;i++){ 61 int min=inf; 62 for(int j=0;j<n;j++){ 63 if(!mark[j]&&map[u][j]<inf&&dist[u]+map[u][j]<=dist[j]){ 64 if(dist[u]+map[u][j]<dist[j]){ 65 dist[j]=dist[u]+map[u][j]; 66 sum_value[j]=sum_value[u]+value[j]; 67 path[j]=u; 68 }else if(sum_value[j]<sum_value[u]+value[j]){ 69 sum_value[j]=sum_value[u]+value[j]; 70 path[j]=u; 71 } 72 } 73 } 74 for(int j=0;j<n;j++){ 75 if(!mark[j]&&min>dist[j]){ 76 min=dist[j],u=j; 77 } 78 } 79 mark[u]=true; 80 } 81 } 82 83 84 85 /* 86 int dfs(int u){ 87 if(u==ed)return 1; 88 if(dp[u])return dp[u]; 89 for(int i=0;i<vet[u].size();i++){ 90 int v=vet[u][i].v; 91 int w=vet[u][i].w; 92 if(dist[v]==dist[u]+w){ 93 dp[u]+=dfs(v); 94 } 95 } 96 return dp[u]; 97 } 98 */ 99 100 int dfs(int u){ 101 if(u==ed)return 1; 102 if(dp[u])return dp[u]; 103 for(int i=0;i<n;i++)if(u!=i){ 104 if(dist[i]==dist[u]+map[u][i]){ 105 dp[u]+=dfs(i); 106 } 107 } 108 return dp[u]; 109 } 110 111 112 void Print(int u){ 113 if(path[u]==-1){ 114 printf("%d",u); 115 return ; 116 } 117 Print(path[u]); 118 printf(" %d",u); 119 } 120 121 int main(){ 122 int u,v,w; 123 while(~scanf("%d%d%d%d",&n,&m,&st,&ed)){ 124 // for(int i=0;i<n;i++)vet[i].clear(); 125 for(int i=0;i<n;i++){ 126 map[i][i]=0; 127 for(int j=i+1;j<n;j++){ 128 map[i][j]=map[j][i]=inf; 129 } 130 } 131 for(int i=0;i<n;i++) 132 scanf("%d",&value[i]); 133 for(int i=1;i<=m;i++){ 134 scanf("%d%d%d",&u,&v,&w); 135 /* 136 Node p1,p2; 137 p1.v=v,p2.v=u; 138 p1.w=p2.w=w; 139 vet[u].push_back(p1); 140 vet[v].push_back(p2); 141 */ 142 map[u][v]=map[v][u]=w; 143 } 144 // SPFA(); 145 Dijkstra(); 146 memset(dp,0,sizeof(dp)); 147 int ans=dfs(st); 148 printf("%d %d\n",ans,sum_value[ed]); 149 Print(ed); 150 puts(""); 151 } 152 return 0; 153 }
View Code
转载于:https://www.cnblogs.com/wally/archive/2013/05/14/3078757.html
zoj 2526(一道很好的最短路应用题)相关推荐
- stl-map的一道很好的题目
Damn Single (25) "Damn Single (单身狗)" is the Chinese nickname for someone who is being sing ...
- 一道PHP题引出的“短路求值”
今天群里有个人问了一个问题,代码如下: $a = 3; $b = 2; if ($a = 2 || $b = 5) { ++$a; } echo $a; 说代码段的执行的结果为1,问大家$a的 ...
- 一道很熟悉的前端面试题,你怎么答?
大家好,我是若川. 最近这几年,云计算的普及和 HTML5 技术的快速发展,越来越多的应用转向了浏览器 / 服务器(B/S)架构,这种改变让浏览器的重要性与日俱增,视频.音频.游戏几大核心场景也都在逐 ...
- 【ZOJ - 3946】Highway Project(最短路子图,维护双权值,贪心,最小树形图)
题干: Edward, the emperor of the Marjar Empire, wants to build some bidirectional highways so that he ...
- 一道很简单的贪心算法题~【贪心:我不要脸的伐?】
文章目录 题目描述 输入 输出 样例输入 样例输出 C语言代码实现 思路 排序 处理 完整代码 C++代码实现 排序 完整代码 彩蛋 题目描述 小健有一家自己的商店,主营牛奶饮品,最近资金紧张,他想以 ...
- 【算法精讲】分享一道很不错的算法题
戳蓝字"CSDN云计算"关注我们哦! 技术头条:干货.简洁.多维全面.更多云计算精华知识尽在眼前,get要点.solve难题,统统不在话下! 作者:帅地 转自:苦逼的码农 分享一道 ...
- 一道很烧脑的面试题?在Android中能否用CPU代替GPU?
02每日一题 在Android中能否用CPU代替GPU? 第二天 「小新」的回答,面试官并不是很满意.那这个问题该怎么回答呢?先来了解下 CPU 与 GPU 的相同点与区别? CPU 即中央处理器,G ...
- 来我主页的小仙女小帅哥给你们一道很有深度(底层原理)的题(能够看到这篇文章的人希望你做一下))
不懂JavaScript底层原理,你以后工作调试程序的时间会大大延长和延长学习新技术的时间 <!DOCTYPE html> <html lang="en"> ...
- 一道很有意思的面试题,考推理和逻辑能力
问题: 一个屋子里面有五十个人,每个人领着一条狗,而这些狗中有一部分病狗(不少于一条).假定有如下条件: 一,狗的病不会传染,也不会不治而愈.也就是说病狗的数量一直不会改变: 二,狗的主人不能看见自己 ...
最新文章
- Linux下tomcat的安装与卸载以及配置(超简单)
- 通过tinyxml解析百度热词榜单
- python工程师薪资坑吗-不在打工就在找坑的路上,3年+程序员都爱跳槽?
- docker保存日志文件到本地
- Java编号姓名元宝数密码,通过my Eclipse控制台向数据库(SQL2008)中查找、删除、插入信息...
- 天池-街景字符编码识别4-模型训练与验证
- Apache Ant使用过程的总结
- 基于序贯重要性重采样的粒子滤波and(RBPF)
- 免费下载百度文库 道客巴巴 豆丁 等付费文档
- 实现Discord聊天机器人
- 淘宝订单接口|订单插旗备注,API稳定、QPS高的方案
- 74cms|骑士cms|开源招聘系统,目录结构
- 康沣生物通过港交所聆讯:持续亏损、现金流紧张,李克俭为董事长
- word中磅和mm的换算
- js对内容进行编码(富文本编辑器使用居多)
- 基于vue2+element+springboot+mybatis+jpa+mysql的学籍管理系统
- Python灰帽子笔记二
- 如何解决百度云下载慢的问题
- Android | 电脑cmd中使用adb命令安装apk
- CSDN博客背景皮肤设置
热门文章
- linux一键打包工具,常见压缩与打包工具
- java 8 list,JAVA8 ListListInteger list中再装一个list转成一个list操作
- python内建函数测试对象身份_Python学习笔记 03 Python对象
- 结型场效应管的结构、特性、参数
- STM32-Systick滴答定时器-延时函数
- php wmi,window_Win7系统中的wmi控件是什么?有什么用?, wmi控件是什么Windows - phpStudy...
- win7系统登录其他服务器端口,win7系统添加打印服务器端口的操作方法
- php做游戏登录服务器,游戏登陆服务器php简单实现
- hadoop yarn 获取日志_Hadoop YARN配置参数剖析(2)—权限与日志聚集相关参数
- SQL Server 2008R2安装详细教程(附安装包)