现在的位置: 首页 > 综合 > 正文

poj 3259 Wormholes

2018年03月17日 ⁄ 综合 ⁄ 共 1043字 ⁄ 字号 评论关闭
题意:John的农场里field块地,path条路连接两块地,hole个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前的自己。

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

代码没优化poj <wbr>3259 <wbr>Wormholes

#include <stdio.h>
#define M 505
#define N 52051
#define inf 999999
struct Edge
{
    int
v1,v2;
    int w;
} edge[N];
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;
   

抱歉!评论已关闭.