您的位置:首页 > 其它

HDU 2066 一个人的旅行

2013-09-11 20:44 330 查看
转载请注明出处:http://blog.csdn.net/a1dark

分析:暴力枚举起点和终点、本来一道秒杀的水题、本不想水的、但是想想还是水一下、不水不要紧、一水吓一跳、memset把我坑惨了、原来只能用memset定义0而不能定义其他数据、切记切记!

#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
#include<string.h>
#define INF 0x7fffffff
#define N 1005
int map1

;
int dist
;
int vis
;
int st
;
int ed
;
int maxx;
int spfa(int s,int e){
memset(vis,0,sizeof(vis));
for(int i=0;i<=maxx;i++)
dist[i]=INF;
queue<int >q;
dist[s]=0;
q.push(s);
vis[s]=1;
while(!q.empty()){
int now=q.front();
q.pop();
vis[now]=0;
for(int i=1;i<=maxx;i++){
if(map1[now][i]!=INF&&(map1[now][i]+dist[now]<dist[i])){
dist[i]=map1[now][i]+dist[now];
if(!vis[i]){
q.push(i);
vis[i]=1;
}
}
}
}
return dist[e];
}
void init(){
for(int i=0;i<N;i++)
for(int j=0;j<N;j++){
if(i==j)map1[i][j]=0;
else map1[i][j]=INF;
}
}
int main(){
int T,S,D;
while(scanf("%d%d%d",&T,&S,&D)!=EOF){
init();
maxx=1;
int s,e,v;
for(int i=1;i<=T;i++){
scanf("%d%d%d",&s,&e,&v);
if(v<map1[s][e]){
map1[s][e]=v;
}
if(v<map1[e][s]){
map1[e][s]=v;
}
if(maxx<s)maxx=s;
if(maxx<e)maxx=e;
}
for(int i=1;i<=S;i++)
scanf("%d",&st[i]);
for(int i=1;i<=D;i++)
scanf("%d",&ed[i]);
int min=INF;
for(int i=1;i<=S;i++){
for(int j=1;j<=D;j++){
if(min>spfa(st[i],ed[j]))
min=spfa(st[i],ed[j]);
}
}
printf("%d\n",min);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最短路 SPFA acm