HDU2066---一个人的旅行(Dijkstra&&floyd&&spfa)
2015-05-12 07:05
447 查看
<pre class="cpp" name="code">#include<iostream>
dijkstra
#include<cstdio> #include<cstring> using namespace std; #define inf 0x3f3f3f3; int map[1100][1100],dist[1100],vis[1100],t,s,d,n; void Dijkstra(int u)//源点 { for(int i=1;i<=n;i++) { dist[i]=map[u][i]; vis[i]=0; } dist[u]=0; vis[u]=1; for(int i=1;i<=n;i++) { int pos=u,min=inf;//每次查找的时候都是从源点开始,pos为u for(int j=1;j<=n;j++) if(!vis[j]&&dist[j]<min) { pos=j; min=dist[j]; } vis[pos]=1; for(int j=1;j<=n;j++) { if(!vis[j]&&dist[j]>dist[pos]+map[pos][j]) dist[j]=dist[pos]+map[pos][j]; } } } int main() { while(scanf("%d%d%d",&t,&s,&d)!=EOF) { int home[1010],go[1010]; for(int i=1;i<=1010;i++) for(int j=1;j<=1010;j++) map[i][j]=inf; n=0; int min=9999; int a,b,c; for(int i=1;i<=t;i++) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c) map[a][b]=map[b][a]=c; if(a>n) n=a; if(b>n) n=b; } for(int i=0;i<s;i++) scanf("%d",&home[i]); for(int i=0;i<d;i++) scanf("%d",&go[i]); for(int i=0;i<s;i++) { Dijkstra(home[i]); for(int j=0;j<d;j++) if(dist[go[j]]<min) min=dist[go[j]]; } printf("%d\n",min); } }
floyd
[code]#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define inf 0xffff int map[1100][1100],dist[110],vis[110],t,s,d,n; void floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) if(map[i][k]!=inf){ for(int j=1;j<=n;j++) if(map[i][k]+map[k][j]<map[i][j]) map[i][j]=map[i][k]+map[k][j];} } int main() { while(scanf("%d%d%d",&t,&s,&d)!=EOF) { n=0; for(int i=1;i<=1001;i++) for(int j=1;j<=1001;j++) if(i==j) map[i][j]=0; else map[i][j]=inf; int a,b,c; for(int i=1;i<=t;i++) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c) map[a][b]=map[b][a]=c; if(b>n) n=b; if(a>n) n=a; } floyd(); int min=inf; int st[1000],e[1000]; for(int i=0;i<s;i++) scanf("%d",&st[i]); for(int i=0;i<d;i++) scanf("%d",&e[i]); for(int i=0;i<s;i++) for(int j=0;j<d;j++) if(map[st[i]][e[j]]<min) min=map[st[i]][e[j]]; printf("%d\n",min); } }
SPFA[/code]
[code]#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define inf 0x3f3f3f3; int map[1100][1100],dis[1100],used[1100],t,s,d,n; int start[1001],End[1111]; int SPFA() { int i; for(i=0;i<n+1;i++) { dis[i] = inf; } queue <int> q; for(i=0;i<s;i++) { dis[start[i]] = 0; q.push(start[i]); used[start[i]] = 1; } while(!q.empty()) { int mid; mid = q.front(); q.pop(); used[mid] = 0; for(i=0;i<n+1;i++) { if(dis[i] > dis[mid] + map[mid][i]) { dis[i] = dis[mid] + map[mid][i]; if(!used[i]) { q.push(i); used[i] = 1; } } } } int MIN = inf; for(i=0;i<d;i++) { MIN = min(MIN,dis[End[i]]); } return MIN; } int main() { while(scanf("%d%d%d",&t,&s,&d)!=EOF) { int home[1010],go[1010]; for(int i=0;i<=1010;i++) for(int j=0;j<=1010;j++) map[i][j]=inf; n=0; int min=9999; int a,b,c; for(int i=1;i<=t;i++) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c) map[a][b]=map[b][a]=c; if(a>n) n=a; if(b>n) n=b; } for(int i=0;i<s;i++) { scanf("%d",&start[i]); } for(int i=0;i<d;i++) { scanf("%d",&End[i]); } int k=SPFA(); printf("%d\n",k); } }
[/code]
相关文章推荐
- hdu2066一个人的旅行【最短路dijkstra&&SPFA】
- HDU 2066:一个人的旅行【Dijkstra & SPFA & Floyd】
- hdoj-2066 一个人的旅行【最短路径--dijkstra&&spfa&&floyd】
- 2066 一个人的旅行【floyd &&dijkstra&& spfa】
- HDU 2066 一个人的旅行【最短路 dijkstra & floyed & SPFA 】
- HDU 2066 一个人的旅行 (最短路----floyd && dijkstra)
- HDU2066 一个人的旅行 【Dijkstra】【Floyd】
- HDU-#2066 一个人的旅行(Floyd & Dijkstra)
- 杭电-2066 一个人的旅行(Floyd&&dijkstra)
- HDOJ 2066 一个人的旅行 (最短路 Dijkstra && SPFA)
- HDU 2066 一个人的旅行 dijkstra&&spfa
- HDU2066一个人的旅行(最短路Dijkstra(枚举), Floyd)
- 几大最短路径算法比较(Floyd & Dijkstra & Bellman-Ford & SPFA)
- hdu2544最短路【最短路dijkstra&&SPFA&&floyd】
- HDU 2066 一个人的旅行(SPFA +Floyd-Warshall算法)
- HDU2066-一个人的旅行-最短路(dijkstra)
- HDU2066 一个人的旅行(Dijkstra)
- HDU 2066 一个人的旅行(SPFA +Floyd-Warshall算法)
- HDOJ 2544 最短路 (最短路 Dijkstra && SPFA && Floyd)
- hdu1874畅通工程续【最短路dijkstra&&SPFA&&floyd】