HDU-2066 一个人的旅行
2011-08-23 23:40
621 查看
Just to practice Dijkstra :-)
HINT:添加一个超级源,和一个超级汇。这个样例数据让人心里没底,因为题中没说城市的编号范围是多少。
HINT:添加一个超级源,和一个超级汇。这个样例数据让人心里没底,因为题中没说城市的编号范围是多少。
/* * HDU-2066 一个人的旅行 * mike-w * 2011-8-23 * --------------------- * practice shortest path algorithm */ #include<stdio.h> #define SIZE 1111 #define INF (1<<30) int time[SIZE][SIZE]; int dist[SIZE]; int in[SIZE]; int T,S,D; int src,sink; int extract(void) { int t,i; for(i=0;i<=sink;i++) if(!in[i]) break; for(t=i++;i<=sink;i++) if(!in[i]&&dist[t]>dist[i]) t=i; return t; } int dijkstra(void) { int min,i; dist[src]=0; while((min=extract())!=sink) { in[min]=1; for(i=0;i<=sink;i++) if(!in[i]&&time[min][i]&&dist[min]+time[min][i]<dist[i]) dist[i]=dist[min]+time[min][i]; } return dist[sink]; } int main(void) { int i,j,t1,t2,t3; #ifndef ONLINE_JUDGE freopen("2066.in","r",stdin); #endif while(scanf("%d%d%d",&T,&S,&D)!=EOF) { /* initialize */ src=0; sink=1010; for(i=0;i<=sink;i++) { dist[i]=INF; in[i]=0; } for(i=0;i<=sink;i++) for(j=0;j<=sink;j++) time[i][j]=0; /* read input */ for(i=0;i<T;i++) { scanf("%d%d%d",&t1,&t2,&t3); if(!time[t1][t2]) time[t1][t2]=time[t2][t1]=t3; else if(time[t1][t2]>t3) time[t1][t2]=time[t2][t1]=t3; } for(i=0;i<S;i++) scanf("%d",&t1),time[src][t1]=time[t1][src]=1; for(i=0;i<D;i++) scanf("%d",&t1),time[sink][t1]=time[t1][sink]=1; /* produce output */ printf("%d\n",dijkstra()-2); } return 0; }
相关文章推荐
- HDU-2066-一个人的旅行
- HDU 2066 一个人的旅行(Dijkstra,建图很巧妙)
- hdu 2066 一个人的旅行 spfa + 建超级源点汇点
- Hdu 2066 一个人的旅行(dijkstra算法,超级起点)
- HDU-2066 一个人的旅行(最短路[Floyd])
- hdu 2066 一个人的旅行【vector优化】
- hdu 2066 一个人的旅行
- HDU - 2066 一个人的旅行(Dijkstra)
- HDU 2066 一个人的旅行.
- hdu_oj_2066 一个人的旅行
- [最短路径] HDU 2066 - 一个人的旅行
- hdu 2066 一个人的旅行 最短路径
- HDU 2066 一个人的旅行
- 一个人的旅行 HDU 2066 &&HDU Today HDU 2112
- HDU - 2066 - 一个人的旅行
- HDU 2066 一个人的旅行
- HDU - 2066 一个人的旅行 —— dijkstra
- hdu 2066 一个人的旅行(单源最短路dijkstra)and hdu 2544
- HDU 2066 一个人的旅行
- hdu 2066 一个人的旅行(最短路+SPFA)