您的位置:首页 > 编程语言 > Go语言

poj3767 I Wanna Go Home

2012-08-21 17:14 225 查看
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Max 0xfffffff
int m[610][610],p[610];
bool vis[610];
bool leader[610];
int vexnum,arcnum;
void dijkstra()
{
int i,j,k,t,min;
memset(vis,0,sizeof(vis));
for(i=1;i<=vexnum;++i)
p[i]=m[1][i];
for(vis[1]=k=1;k<vexnum;++k){
for(min=Max,i=1;i<=vexnum;++i)
if(!vis[i]&&min>p[i]){
min=p[i];
t=i;
}
vis[t]=1;
for(i=1;i<=vexnum;++i)
if(!vis[i]&&p[i]>min+m[t][i])
p[i]=min+m[t][i];
}
}
int main()
{
int i,j,t,a,b,w;
while(scanf("%d",&vexnum),vexnum&&scanf("%d",&arcnum)){
for(i=1;i<=vexnum;++i)
for(j=1;j<=vexnum;++j)
m[i][j]=m[j][i]=Max;
for(i=0;i<arcnum;++i){
scanf("%d%d%d",&a,&b,&w);
if(w<m[a][b])
m[a][b]=m[b][a]=w;
}
for(i=1;i<=vexnum;++i){
scanf("%d",&t);
leader[i]=t-1;
}
for(i=1;i<=vexnum;++i)
for(j=1;j<=vexnum;++j){
if(leader[i]!=leader[j]){
if(leader[i]) m[i][j]=Max;
else m[j][i]=Max;
}
}
dijkstra();
if(p[2]<Max) printf("%d\n",p[2]);
else printf("-1\n");//忘加了一个“-1”,贡献了一个WA
}
system("pause");
return 0;
}


//稍微变化一下的dijktra
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: