hdu3790 最短路径问题<最短路>
2016-03-08 17:13
375 查看
最短路径问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19990 Accepted Submission(s): 5947
Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
Output
输出 一行有两个数, 最短距离及其花费。
Sample Input
3 2
1 2 5 6
2 3 4 5
1 3
0 0
Sample Output
9 11
Source
浙大计算机研究生复试上机考试-2010年
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19990 Accepted Submission(s): 5947
Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
Output
输出 一行有两个数, 最短距离及其花费。
Sample Input
3 2
1 2 5 6
2 3 4 5
1 3
0 0
Sample Output
9 11
Source
浙大计算机研究生复试上机考试-2010年
#include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; int n,m,s,t; int map[1020][1020]; int chang[1020][1020]; int dis[1020],lo[1020]; int lon,money; void find(int ss,int tt) { bool fafe[1020]; memset(fafe,true,sizeof(fafe)); fafe[ss]=false; for (int i=1;i<=n;i++) { dis[i]=map[ss][i]; lo[i]=chang[ss][i]; } dis[ss]=0; int mi,kk; for(int j=0;j<n;j++) { mi=0x3f3f3f; for (int i=1;i<=n;i++) if (fafe[i]&&mi>dis[i]) { mi=dis[i]; kk=i; } if (kk==tt) { lon=mi; money=lo[tt]; break; } fafe[kk]=false; for (int i=1;i<=n;i++) if (fafe[i]&&dis[i]>=(mi+map[kk][i])) { if (dis[i]==mi+map[kk][i]) lo[i]=min(lo[i],lo[kk]+chang[kk][i]); else { dis[i]=mi+map[kk][i]; lo[i]=lo[kk]+chang[kk][i]; } } } } int main() { while (~scanf("%d%d",&n,&m)) { if (n==0&&m==0) break; memset(map,0x3f3f3f,sizeof(map)); memset(chang,0x3f3f3f,sizeof(chang)); int a,b,d,p; for (int i=0;i<m;i++) { scanf("%d%d%d%d",&a,&b,&d,&p); if (d<map[a][b]) { map[a][b]=map[b][a]=d; chang[a][b]=chang[b][a]=p; } //map[a][b]=map[b][a]=min(d,map[a][b]); //if (map[a][b]==d) chang[a][b]=chang[b][a]=min(p,chang[a][b]);这里出错了。。。 。-。-。-。-。-。-。-。 } scanf("%d%d",&s,&t); find(s,t); printf("%d %d\n",lon,money); } return 0; }
相关文章推荐
- 关于ListView 中有head的时候,有事件要处理的时候,
- node.js微信开发《一》
- java并发编程:线程安全管理类--原子操作类--AtomicStampedReference<V>
- Public key for mysql....rpm is not installed
- 进击的正益工场,2016技术与生态齐头并进
- 分享一种用户密码加密方式
- Leetcode299. Bulls and Cows
- Codeforces--630F--Selection of Personnel(组合数)
- Swift的一些基本属性2 (控制流)
- CodeForces 632A-Grandma Laura and Apples
- Photoshop快速复制图层的几种方法和技巧
- NSInputStream 和 NSOutputStream
- 菜鸟教程 Python100例 之实例29
- Jsoup解析HTML、加载文档等实例
- Codeforces--630F--Selection of Personnel(组合数)
- linux系统Qt调用opencv的编译过程(ubuntu14.04 kylin+qt5.5+opencv2.4.10)
- 基于jQuery的网页影音播放器jPlayer的基本使用教程
- 关于eclipse 部署tomcat和将项目部署到tomcat的webapps
- 图
- CodeForces 630H- Benches【组合数学】