POJ——T3259 Wormholes

http://poj.org/problem?id=3259

Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 50692   Accepted: 18750

发现虫洞的的JOhn~开始他的神秘之~~~~

就是给你m条带权双向边,w条带权单向边

可以将单边制成负的,SFPA求一下是否有负环

 1 #include <cstring>
 2 #include <cstdio>
 3 
 4 #define MIN(a,b) ( a<b ?a :b)
 5 
 6 using namespace std;
 7 
 8 const int N(2521);
 9 int t,n,m,c,u,v,w;
10 int head[N],sumedge;
11 struct Edge
12 {
13     int to,next,cost;
14     Edge(int to=0,int next=0,int cost=0):
15         to(to),next(next),cost(cost){}
16 }edge[N<<1];
17 
18 void ins(int from,int to,int cost)
19 {
20     edge[++sumedge]=Edge(to,head[from],cost);
21     head[from]=sumedge;
22 }
23 
24 int if_YES,vis[N],dis[N];
25 
26 void SPFA(int now)
27 {
28     vis[now]=1;
29     if(if_YES) return ;
30     for(int i=head[now];i;i=edge[i].next)
31     {
32         int go=edge[i].to;
33         if(dis[go]>dis[now]+edge[i].cost)
34         {
35             if(vis[go])
36             {
37                 if_YES=1;
38                 break;
39             }
40             dis[go]=dis[now]+edge[i].cost;
41             SPFA(go);
42         }
43     }
44     vis[now]=0;
45 }
46 
47 void init()
48 {
49     if_YES=sumedge=0;
50     memset(vis,0,sizeof(vis));
51     memset(dis,0,sizeof(dis));
52     memset(head,0,sizeof(head));
53 }
54 
55 int main()
56 {
57     scanf("%d",&t);
58     for(;t;t--)
59     {    init();
60         scanf("%d%d%d",&n,&m,&c);
61         for(;m;m--)
62         {
63             scanf("%d%d%d",&u,&v,&w);
64             ins(u,v,w); ins(v,u,w);
65         }    
66         for(;c;c--)
67         {
68             scanf("%d%d%d",&u,&v,&w);
69             ins(u,v,-w);
70         }
71         for(int i=1;i<=n;i++)
72         {
73             SPFA(i);
74             if(if_YES) break;
75         }
76         if(if_YES) printf("YES
");
77         else        printf("NO
");
78     }
79     return 0;
80 }
——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
原文地址:https://www.cnblogs.com/Shy-key/p/6884379.html