题目链接: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(一道很好的最短路应用题)相关推荐

  1. stl-map的一道很好的题目

    Damn Single (25) "Damn Single (单身狗)" is the Chinese nickname for someone who is being sing ...

  2. 一道PHP题引出的“短路求值”

    今天群里有个人问了一个问题,代码如下: $a = 3; $b = 2; if ($a = 2 || $b = 5) {     ++$a; } echo $a; 说代码段的执行的结果为1,问大家$a的 ...

  3. 一道很熟悉的前端面试题,你怎么答?

    大家好,我是若川. 最近这几年,云计算的普及和 HTML5 技术的快速发展,越来越多的应用转向了浏览器 / 服务器(B/S)架构,这种改变让浏览器的重要性与日俱增,视频.音频.游戏几大核心场景也都在逐 ...

  4. 【ZOJ - 3946】Highway Project(最短路子图,维护双权值,贪心,最小树形图)

    题干: Edward, the emperor of the Marjar Empire, wants to build some bidirectional highways so that he ...

  5. 一道很简单的贪心算法题~【贪心:我不要脸的伐?】

    文章目录 题目描述 输入 输出 样例输入 样例输出 C语言代码实现 思路 排序 处理 完整代码 C++代码实现 排序 完整代码 彩蛋 题目描述 小健有一家自己的商店,主营牛奶饮品,最近资金紧张,他想以 ...

  6. 【算法精讲】分享一道很不错的算法题

    戳蓝字"CSDN云计算"关注我们哦! 技术头条:干货.简洁.多维全面.更多云计算精华知识尽在眼前,get要点.solve难题,统统不在话下! 作者:帅地 转自:苦逼的码农 分享一道 ...

  7. 一道很烧脑的面试题?在Android中能否用CPU代替GPU?

    02每日一题 在Android中能否用CPU代替GPU? 第二天 「小新」的回答,面试官并不是很满意.那这个问题该怎么回答呢?先来了解下 CPU 与 GPU 的相同点与区别? CPU 即中央处理器,G ...

  8. 来我主页的小仙女小帅哥给你们一道很有深度(底层原理)的题(能够看到这篇文章的人希望你做一下))

    不懂JavaScript底层原理,你以后工作调试程序的时间会大大延长和延长学习新技术的时间 <!DOCTYPE html> <html lang="en"> ...

  9. 一道很有意思的面试题,考推理和逻辑能力

    问题: 一个屋子里面有五十个人,每个人领着一条狗,而这些狗中有一部分病狗(不少于一条).假定有如下条件: 一,狗的病不会传染,也不会不治而愈.也就是说病狗的数量一直不会改变: 二,狗的主人不能看见自己 ...

最新文章

  1. Linux下tomcat的安装与卸载以及配置(超简单)
  2. 通过tinyxml解析百度热词榜单
  3. python工程师薪资坑吗-不在打工就在找坑的路上,3年+程序员都爱跳槽?
  4. docker保存日志文件到本地
  5. Java编号姓名元宝数密码,通过my Eclipse控制台向数据库(SQL2008)中查找、删除、插入信息...
  6. 天池-街景字符编码识别4-模型训练与验证
  7. Apache Ant使用过程的总结
  8. 基于序贯重要性重采样的粒子滤波and(RBPF)
  9. 免费下载百度文库 道客巴巴 豆丁 等付费文档
  10. 实现Discord聊天机器人
  11. 淘宝订单接口|订单插旗备注,API稳定、QPS高的方案
  12. 74cms|骑士cms|开源招聘系统,目录结构
  13. 康沣生物通过港交所聆讯:持续亏损、现金流紧张,李克俭为董事长
  14. word中磅和mm的换算
  15. js对内容进行编码(富文本编辑器使用居多)
  16. 基于vue2+element+springboot+mybatis+jpa+mysql的学籍管理系统
  17. Python灰帽子笔记二
  18. 如何解决百度云下载慢的问题
  19. Android | 电脑cmd中使用adb命令安装apk
  20. CSDN博客背景皮肤设置

热门文章

  1. linux一键打包工具,常见压缩与打包工具
  2. java 8 list,JAVA8 ListListInteger list中再装一个list转成一个list操作
  3. python内建函数测试对象身份_Python学习笔记 03 Python对象
  4. 结型场效应管的结构、特性、参数
  5. STM32-Systick滴答定时器-延时函数
  6. php wmi,window_Win7系统中的wmi控件是什么?有什么用?,  wmi控件是什么Windows - phpStudy...
  7. win7系统登录其他服务器端口,win7系统添加打印服务器端口的操作方法
  8. php做游戏登录服务器,游戏登陆服务器php简单实现
  9. hadoop yarn 获取日志_Hadoop YARN配置参数剖析(2)—权限与日志聚集相关参数
  10. SQL Server 2008R2安装详细教程(附安装包)