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

poj 3767 I Wanna Go Home

2011-08-16 17:26 423 查看
题目分析:

这个题属于典型的dijkstra 算法的题;

n个村庄,m 条路 和两村庄之间所用时间

最后是各个城市所属阵营;

题意分析:

分为两个阵营,1,2城市分别属于1,2阵营(题意简单化题目)求从城市1到城市2 的最短时间

重点:

可以从城市1到2,反则不行:因此,在这加上判断条件,套用dijkstra算法就ok了

#include<stdio.h>

#define max 0x7fffffff

int grah[601][601];

int root[601];

int n;

void dij()

{

int d[601];

bool vis[601]={false};

int i,j,pos=0;

for(i = 0;i < n; i++)

d[i] = grah[0][i];

vis[0] = true ;

for( i= 1; i <= n; i++)

{

int min=max;

for(j = 0; j < n; j++)

{

if( ! vis[j] && min > d[j])

{

min=d[j];

pos = j;

}

}

vis[pos] = true;

for( j = 0;j < n ;j++)

{

if( !vis[j] && grah[pos][j] < max && !(root[pos] == 2 && root[j] == 1))

{

if(d[j] > d[pos]+ grah[pos][j])

d[j] = d[pos] + grah[pos][j];

}

}

}

if(d[1] < max) printf("%d\n",d[1]);

else  printf("-1\n");

}

int main()

{

//	freopen("e://1.txt","r",stdin);

int m,x,y,z,i,j;

while(scanf("%d",&n),n)

{

for(i = 0;i < n;i++)

for(j = 0;j < n;j++)

{

if(i==j) grah[i][j]=0;

else grah[i][j]=max;

}

scanf("%d",&m);

while(m--)

{

scanf("%d%d%d",&x,&y,&z);

grah[x-1][y-1]=grah[y-1][x-1]=z;

}

for(i = 0;i < n;i++)

scanf("%d",root+i);

dij();

}

return 0;

}


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