HDU 2066 一个人的旅行
来源:互联网 发布:猜幻数游戏编程c语言 编辑:程序博客网 时间:2024/06/03 07:30
http://acm.hdu.edu.cn/showproblem.php?pid=2066
迪杰斯特拉算法实现(400MS):
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;const int MAX = 1001;int V,E,G[1010][1010],dis[1010],vis[1010];int u[1010],v[1010];void dijkstra(int scr){ for(int i=0; i<MAX; i++){ dis[i] = G[scr][i]; vis[i] = 0; } vis[scr] = 1; for(int i=0; i<V-1; i++){ int tmp = 1e9, k = scr; for(int j=1; j<=V; j++){ if(vis[j]) continue; if(dis[j] < tmp){ tmp = dis[j]; k = j; } }// cout << tmp << endl; vis[k] = 1; for(int j=1; j<=V; j++){ if(vis[j]) continue; dis[j] = min(dis[j], dis[k] + G[k][j]); } }}int main(){// freopen("in.txt", "r", stdin); int a,b; while(scanf("%d%d%d",&E,&a,&b) == 3){ for(int i=1; i<MAX; i++){ for(int j=1; j<MAX; j++){ G[i][j] = 1e9; } G[i][i] = 0; } for(int i=0; i<E; i++){ int from,to,cost; scanf("%d%d%d",&from,&to,&cost); V = max(V, max(from, to)); G[from][to] = G[to][from] = min(G[from][to],cost); } for(int i=0; i<a; i++){ scanf("%d",&u[i]); } for(int i=0; i<b; i++){ scanf("%d",&v[i]); } int ans = 1e9; for(int i=0; i<a; i++){ dijkstra(u[i]); for(int j=0; j<b; j++) ans = min(ans, dis[v[j]]); } printf("%d\n",ans); } return 0;}
SPFA实现(0MS):
#include <queue>#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;struct edge{ int to; int cost; int next;}adj[2000010];int num,head[1010],a,b,c,V;void addedge(int from, int to, int cost){ adj[num].to = to; adj[num].cost = cost; adj[num].next = head[from]; head[from] = num++;}int dis[1010],vis[1010],enter[1010];bool SPFA(int scr){ for(int i=1; i<=V; i++){ dis[i] = 1e9; vis[i] = 0; enter[i] = 0; } dis[scr] = 0; vis[scr] = 1; enter[scr] = 1; queue <int> Q; Q.push(scr); while(!Q.empty()){ int tmp = Q.front(); Q.pop(); vis[tmp] = 0; for(int i=head[tmp]; i!=-1; i=adj[i].next){ if(dis[adj[i].to] > dis[tmp] + adj[i].cost){ dis[adj[i].to] = dis[tmp] + adj[i].cost; if(!vis[dis[adj[i].to]]){ vis[adj[i].to] = 1; enter[adj[i].to]++; if(enter[adj[i].to] >= V) return false; Q.push(adj[i].to); } } } } return true;}int u[1010],v[1010];int main(){// freopen("in.txt", "r", stdin); while(scanf("%d%d%d",&a,&b,&c) == 3){ memset(head, -1, sizeof(head)); num = 0; for(int i=0; i<a; i++){ int from, to, cost; scanf("%d%d%d",&from,&to,&cost); V = max(V, max(from, to)); addedge(from, to, cost); addedge(to, from, cost); } for(int i=0; i<b; i++) scanf("%d",&u[i]); for(int i=0; i<c; i++) scanf("%d",&v[i]); int ans = 1e9; for(int i=0; i<b; i++){ SPFA(u[i]); for(int j=0; j<c; j++) ans = min(ans, dis[v[j]]); } printf("%d\n",ans); } return 0;}
0 0
- HDU 2066 一个人的旅行
- hdu 2066 一个人的旅行
- HDU-2066 一个人的旅行
- Hdu-2066 一个人的旅行
- HDU 2066 一个人的旅行
- HDU 2066 一个人的旅行
- hdu 2066 一个人的旅行
- hdu 2066 一个人的旅行
- hdu 2066 一个人的旅行
- HDU 2066 一个人的旅行
- hdu 2066 一个人的旅行
- HDU 2066 一个人的旅行
- hdu 2066 一个人的旅行
- hdu 2066 一个人的旅行
- HDU 2066 一个人的旅行
- HDU 2066 一个人的旅行
- HDU 2066 一个人的旅行
- hdu 2066(一个人的旅行)
- 运行locate无法找到mlocate.db的解决方法
- Eclipse快捷键 10个最有用的快捷键
- Netty3 源码分析 - ChannelPipeline
- 正式使用opencv里的训练和检测 - opencv_createsamples、opencv_traincascade-2.4.11版本
- maven使用技巧
- HDU 2066 一个人的旅行
- document.createElement()的用法
- 指针与字符串操作-一道腾讯笔试题
- Failed to fetch URl https://dl-ssl.google.com/android/repository/addo Android SDK更新以及ADT更新出现问题的解决办法
- phpcms_v9如何在首页显示或排除某些栏目subcat(0,0,0,$siteid)
- Source Insight常用快捷键及注释快捷键设置
- LeetCode-Palindrome Number
- 操作系统监控命令
- NotificationManager和Notification的使用总结