您的位置:首页 > 其它

hdu 2066 一个人的旅行(Dijkstra求最短路问题)

2013-06-07 20:39 417 查看
这题是我在没学Dijkstra算法时做的,所以跟模板有点不一样,但是意思差不多。如果要看标准的Dijkstra算法的话,可以去查有关知识。

代码如下:

// Time 0ms, Memory 5884K
#include<stdio.h>
#include<string.h>
int map[1200][1200],v1[1200],v2[1200],l,d1[1200],d;
int f(int x)
{
int i,min,n=0,y,z,m=-1,v[1200];
memset(d1,-1,sizeof(d1));
memset(v,-1,sizeof(v));
y=x;d1[x]=0;
while(1)
{
min=-1;
for(i=0;i<=l;i++) if(v1[i] && v[i])
{
if(map[y][i]!=-1 && (d1[i]==-1 || d1[i]>(d1[y]+map[y][i]))) d1[i]=d1[y]+map[y][i];
if(min==-1 || (d1[i]!=-1 && min>d1[i]))
{
min=d1[i];z=i;
}
}
if(min==-1) return m;
v[z]=0;y=z;
if(v2[z])
{
n++;
if(m==-1 || m>d1[z]) m=d1[z];
}
if(n==d) return m;
}
}
int main()
{
int t,s,a,b,i,p[1200],q[1200],min,m1,w;
while(scanf("%d%d%d",&t,&s,&d)==3)
{
memset(map,-1,sizeof(map));
memset(v1,0,sizeof(v1));
memset(v2,0,sizeof(v2));
l=-1;min=-1;
while(t--)
{
scanf("%d%d%d",&a,&b,&w);
if(map[b][a]==-1 || map[a][b]>w) map[b][a]=map[a][b]=w;
if(l==-1 || l<a) l=a;
if(l<b) l=b;
v1[a]=1;v1[b]=1;
}
for(i=0;i<s;i++)
{
scanf("%d",&p[i]);v1[p[i]]=0;
}
for(i=0;i<d;i++)
{
scanf("%d",&q[i]);v2[q[i]]=1;
}
for(i=0;i<s;i++)
{
if(v2[p[i]])
{
min=0;break;
}
m1=f(p[i]);
if(min==-1 || (m1!=-1 && min>m1)) min=m1;
}
printf("%d\n",min);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: