您的位置:首页 > 其它

poj 3259 Wormholes

2013-04-23 09:22 183 查看
题意:John的农场里field块地,path条路连接两块地,hole个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前的自己。

思路:用bellman-ford 判断有没有负权回路,如果有他就能看到自己。
不过,我认为应该判断每个点有没有负权回路,而不仅仅只判断第一个点就行了(如果某位大牛路过看到,觉得理解不对 希望多多指教)

代码没优化

3259 Wormholes" TITLE="poj 3259 Wormholes" />

#include <stdio.h>

#define M 505

#define N 52051

#define inf 999999

struct Edge

{

int
v1,v2;

int w;

} edge
;

int num;

int bellman(int n)

{

int
i,j,k,dis[M];

k = 1;

// for (k = 1; k
<= n; k
++)
//这里本是要判断所有点的

// {

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

dis[i] = inf;

dis[k] = 0;

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

{

for (j = 1; j <= num; j ++)

if (dis[edge[j].v2] >
dis[edge[j].v1]+edge[j].w)

dis[edge[j].v2] = dis[edge[j].v1]+edge[j].w;

}

for (j = 1; j <= num; j ++)

if (dis[edge[j].v2] >
dis[edge[j].v1]+edge[j].w)

return 0;

// }

return
1;

}

int main ()

{

int
t,n,m,v1,v2,w,time,k;

scanf
("%d",&t);

while (t
--)

{

scanf
("%d%d%d",&n,&m,&w);

k = 1;

while (m --)

{

scanf
("%d%d%d",&v1,&v2,&time);

edge[k].v1 = v1;

edge[k].v2 = v2;

edge[k].w = time;

k ++;

edge[k].v2 = v1;

edge[k].v1 = v2;

edge[k].w = time;

k ++;

}

while (w --)

{

scanf
("%d%d%d",&v1,&v2,&time);

edge[k].v1 = v1;

edge[k].v2 = v2;

edge[k].w = -1*time;

k ++;

}

num = k-1;

int ans = bellman(n);

if (ans==0)

printf ("YES\n");

else

printf ("NO\n");

}

return
0;

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