您的位置:首页 > 其它

HDU 2066 一个人的旅行【Dijkstra 】

2015-04-07 20:45 393 查看
题意:给出s个起点,d个终点,问从这些起点到达终点的最短距离

因为有多个起点,所以把这多个起点的值设为0

哎= =改了好久的说= =

是因为在代码里面的t,不知道为什么调用dijkstra()函数之后就会变成INF的值-

后来先保存下t的值,再调用----------555555555

#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

typedef long long LL;
const int INF = 100000000;
const int maxn=1010;
int w[maxn][maxn],v[maxn],a[maxn],b[maxn],d[maxn];
int t,s,n;

void dijkstra(){
int i,j,k;
for(i=1;i<=maxn;i++) d[i]=INF;
for(i=1;i<=s;i++) d[a[i]]=0;

memset(v,0,sizeof(v));

for(i=1;i<=maxn;i++){
int x,m=INF;
for(int y=1;y<=maxn;y++) if(!v[y]&&d[y]<=m) m=d[x=y];
v[x]=1;
for(int y=1;y<=maxn;y++) d[y]=min(d[y],d[x]+w[x][y]);
}
}

int main(){
int i,j,k,u,v,ww;
while(scanf("%d %d %d",&n,&s,&t)!=EOF){
for(i=1;i<=maxn;i++){
for(j=1;j<=maxn;j++){
if(i==j) w[i][j]=0;
else w[i][j]=INF;
}
}

for(i=1;i<=n;i++) {
scanf("%d %d %d",&u,&v,&ww);
if(w[u][v]>ww) w[u][v]=ww,w[v][u]=ww;
}

for(i=1;i<=s;i++) scanf("%d",&a[i]);
for(i=1;i<=t;i++) scanf("%d",&b[i]);
int idx=t;

dijkstra();

int ans=INF;
t=idx;

for(i=1;i<=t;i++) {
ans=min(ans,d[b[i]]);
}
printf("%d\n",ans);
}
return 0;
}


View Code

dijkstra的第一题= = go--go--g0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: