poj 3259spfa()判断是否存在负环

来源:互联网 发布:mac office 账号密码 编辑:程序博客网 时间:2024/05/22 06:23
http://poj.org/problem?id=3259
Wormholes
Time Limit: 2000MSMemory Limit: 65536KTotal Submissions: 22876Accepted: 8144

Description

While exploring his many farms, Farmer John has discovered anumber of amazing wormholes. A wormhole is very peculiar because itis a one-way path that delivers you to its destination at a timethat is BEFORE you entered the wormhole! Each of FJ's farmscomprises N (1≤ N ≤ 500) fieldsconveniently numbered1..NM (1≤ M ≤ 2500) paths,and W (1≤ W ≤ 200) wormholes.

As FJ is an avid time-traveling fan, he wants to do thefollowing: start at some field, travel through some paths andwormholes, and return to the starting field a time before hisinitial departure. Perhaps he will be able to meet himself :) .

To help FJ find out whether this is possible or not, he willsupply you with complete mapsto F (1≤ F ≤ 5) of his farms. Nopaths will take longer than 10,000 seconds to travel and nowormhole can bring FJ back in time by more than 10,000 seconds.

Input

Line 1: A singleinteger, FF farmdescriptions follow. 
Line 1 of each farm: Three space-separated integersrespectively: NM,and W 
Lines 2..M+1 of each farm: Three space-separated numbers(SET)that describe, respectively: a bidirectional pathbetween S and E thatrequires T seconds totraverse. Two fields might be connected by more than onepath. 
Lines M+2..M+W+1 of eachfarm: Three space-separated numbers(SET)that describe, respectively: A one way pathfrom S to E thatalso moves the travelerback T seconds.

Output

Lines 1..F: For each farm, output "YES" ifFJ can achieve his goal, otherwise output "NO" (do not include thequotes).

Sample Input

23 3 11 2 21 3 42 3 13 1 33 2 11 2 32 3 43 1 8

Sample Output

NOYES

Hint

For farm 1, FJ cannot travel back intime. 
For farm 2, FJ could travel back in time by the cycle1->2->3->1, arriving back at his starting location 1second before he leaves. He could start from anywhere on the cycleto accomplish this.

Source

USACO 2006 December Gold
//题解:图论算法。
//ac

// I'm theTopcoder
//C
#include
#include
#include
#include
#include
#include
//C++
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespacestd;

//*************************OUTPUT*************************
#ifdefWIN32
#define INT64"%I64d"
#define UINT64"%I64u"
#else
#define INT64"%lld"
#define UINT64"%llu"
#endif

//**************************CONSTANT***********************
#define INF0x3f3f3f3f
#define eps1e-8
#define PIacos(-1.)
#define PI2asin (1.);
typedef longlong LL;
//typedef__int64 LL;   //codeforces
typedefunsigned int ui;
typedefunsigned long long ui64;
#define MPmake_pair
typedef vectorVI;
typedef pairPII;
#define pbpush_back
#define mpmake_pair

//***************************SENTENCE************************
#define CL(a,b)memset (a, b, sizeof (a))
#definesqr(a,b) sqrt ((double)(a)*(a) +(double)(b)*(b))
#definesqr3(a,b,c) sqrt((double)(a)*(a) + (double)(b)*(b) +(double)(c)*(c))

//****************************FUNCTION************************
template doubleDIS(T va, T vb) { return sqr(va.x - vb.x, va.y - vb.y);}
template inlineT INTEGER_LEN(T v) { int len = 1; while (v /= 10) ++len; returnlen; }
template inlineT square(T va, T vb) { return va * va + vb * vb;}

// aply for thememory of the stack
//#pragmacomment (linker,"/STACK:1024000000,1024000000")
//end

const int maxn= 1000000+100;
structnode{
   int to;
   int next;
   long long weight;
};
nodeedge[maxn],edge1[maxn];//保存边的起点和终点
intn,m;
long longval;
inttot,tot1;
intsrc;//起点
inthead[maxn],head1[maxn];
intvisit[maxn],visit1[maxn];
long longdis[maxn],dis1[maxn];
long longans[maxn],ans2[maxn];
long longMAXTIME=-INF;
intsum1[maxn],sum11[maxn];;

void add(inta,int b,long long c){
   edge[tot].to=b;
   edge[tot].weight=c;
   edge[tot].next=head[a];
   head[a]=tot++;
}

void add1(inta,int b,long long c){
   edge1[tot1].to=b;
   edge1[tot1].weight=c;
   edge1[tot1].next=head1[a];
   head1[a]=tot1++;
}

boolspfa(){
   //初始化
   for(int i=1;i<=n;i++){
      dis[i]=INF;
      visit[i]=0;//访问标记
      sum1[i]=0;
   }
   dis[src]=0; visit[src]=1;
   int u;
   int v;
   queue Q;//优先队列
   Q.push(src);
   while(!Q.empty()){
      u=Q.front();
      Q.pop();
      visit[u]=0;
      if(sum1[u]>n) return true;
       for(inti=head[u];i!=-1;i=edge[i].next){
         v=edge[i].to;
         if(dis[v]>dis[u]+edge[i].weight){
            dis[v]=dis[u]+edge[i].weight;
             if(!visit[v]){
                Q.push(v);
                visit[v]=1;
                sum1[v]++;
             }
          }
      }
   }
   return false;
}



intmain(){
   int a,b,c,w;
   int t;
   scanf("%d",&t);
   while( t--){
      tot=tot1=0;//边的条数
      scanf("%d%d%d",&n,&m,&w);//w个洞
       for(inti=1;i<=n;i++){
         head[i]=-1;
         head1[i]=-1;
      }
       for(inti=1;i<=m;i++){
         scanf("%d%d%d",&a,&b,&c);
         add(a,b,c);
         add(b,a,c);
         //add1(b,a,c);
      }
       for(inti=1;i<=w;i++){
         scanf("%d%d%d",&a,&b,&c);
         add(a,b,-c);
      }
      src=1;
      if(spfa()){
         printf("YES\n");
      }
       elseprintf("NO\n");
   }
   return 0;
}