HDU2066 一个人的旅行(dijkstra算法)
2016-11-15 22:44
295 查看
一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 33769 Accepted Submission(s): 11589 Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。 Input 输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个; 接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路) 接着的第T+1行有S个数,表示和草儿家相连的城市; 接着的第T+2行有D个数,表示草儿想去地方。 Output 输出草儿能去某个喜欢的城市的最短时间。 Sample Input 6 2 3 1 3 5 1 4 7 2 8 12 3 8 4 4 9 12 9 10 2 1 2 8 9 10 Sample Output 9
握草,刚学这个算法,被一本算法书坑了好久,xjb搞。 就dijkstra算法。 把小草的家设置为0的点,然后把与之相邻的点的权值设置为0,我们就把多源点变成了一个起点,求单源最短路。 只需要求出多个终点中用时最低的那个终点就可以了。
#include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cctype> #include<cmath> #include<ctime> #include<string> #include<stack> #include<deque> #include<queue> #include<list> #include<set> #include<map> #include<cstdio> #include<limits.h> #define MOD 1000000007 #define fir first #define sec second #define fin freopen("/home/ostreambaba/文档/input.txt", "r", stdin) #define fout freopen("/home/ostreambaba/文档/output.txt", "w", stdout) #define mes(x, m) memset(x, m, sizeof(x)) #define Pii pair<int, int> #define Pll pair<ll, ll> #define INF 1e9+7 #define inf 0x3f3f3f3f #define Pi 4.0*atan(1.0) #define lowbit(x) (x&(-x)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef long long ll; typedef unsigned long long ull; const double eps = 1e-12; const int maxn = 1010; using namespace std; inline int read(){ int x(0),f(1); char ch=getchar(); while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } int T,S,D,a,b,t; int d[maxn],s[maxn]; bool vis[maxn]; int dis[maxn]; int G[maxn][maxn]; void init(int tot) { for(int i=1;i<=tot;++i){ dis[i]=inf; } } void dijkstra(int st,int n) { mes(vis,false); for(int i=1;i<=n;++i){ dis[i]=G[0][i]; } dis[st]=0; //vis[0]=true; int mark; for(int i=1;i<=n;++i){ int mindis=inf; for(int j=1;j<=n;++j){ if(!vis[j]&&dis[j]<mindis){ mindis=dis[j]; mark=j; } } vis[mark]=true; for(int j=1;j<=n;++j){ if(!vis[j]){ dis[j]=min(dis[j],dis[mark]+G[mark][j]); } } } int re=inf; for(int i=0;i<D;++i){ re=min(re,dis[d[i]]); } printf("%d\n",re); } int main() { while(~scanf("%d%d%d",&T,&S,&D)){ mes(G,0x3f); int tot=-1; for(int i=1;i<=T;++i){ a=read(),b=read(),t=read(); if(G[a][b]>t){ G[a][b]=G[b][a]=t; } tot=max(tot,max(a,b)); } init(tot); for(int i=0;i<S;++i){ s[i]=read(); G[0][s[i]]=G[s[i]][0]=0; } for(int i=0;i<D;++i){ d[i]=read(); } dijkstra(0,tot); } return 0; }
相关文章推荐
- HDU 2066 一个人的旅行 (Dijkstra算法)
- hdu 2066 一个人的旅行 最短路径dijkstra算法
- HDU:2066 一个人的旅行(dijkstra算法求最短路径)
- Hdu 2066 一个人的旅行(dijkstra算法,超级起点)
- Hdu 2066 一个人的旅行(dijkstra算法)
- HDU 2066 一个人的旅行(Dijkstra算法)
- (阶段三 dijkstra算法温习1.2)HDU 2066 一个人的旅行(使用dijkstra来解决多源起点和多源终点的最短路径问题)
- hdu 2066 一个人的旅行(最短路径 Dijkstra算法)
- HDU 2066 一个人的旅行 (最短路--Dijkstra算法)
- 最短路算法 Dijkstra算法 HDU 2066 一个人的旅行
- HDU 2066 一个人的旅行(Dijkstra算法)
- hdu 2066 一个人的旅行 (Dijkstra算法)
- hdu 2066一个人的旅行 Dijkstra算法应用
- HDU 2066 一个人的旅行
- HDU 2066 一个人的旅行 - from lanshui_Yang
- hdu 2066 一个人的旅行(最短路+SPFA)
- HDU - 2066- 一个人的旅行【最短路】
- hdu 2066 一个人的旅行
- HDU 2066 一个人的旅行
- HDU - 2066 一个人的旅行 —— dijkstra