HDU 4738 Caocao's Bridges(Tarjan)

题目链接

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 #include <queue>
  5 #include <cstdlib>
  6 using namespace std;
  7 #define N 1001
  8 #define M 20000001
  9 #define INF 0x3f3f3f3f
 10 struct node
 11 {
 12     int u,v,next;
 13 }edge[M];
 14 int first[N],DFN[N],Belong[N],stack[N],Low[N],cnum[N];
 15 int in[N],d[N];
 16 int qu[M],qv[M],qw[M];
 17 int n,m;
 18 bool vis[M];
 19 int tot,scnt,top;
 20 int o[M];
 21 void CL()
 22 {
 23     tot = scnt = top = 0;
 24     memset(first,-1,sizeof(first));
 25     memset(in,0,sizeof(in));
 26     memset(DFN,0,sizeof(DFN));
 27     memset(vis,0,sizeof(vis));
 28 }
 29 void add(int u,int v,int w)
 30 {
 31     edge[tot].u = u;
 32     edge[tot].v = v;
 33     edge[tot].next = first[u];
 34     first[u] = tot ++;
 35 }
 36 void Tarjan(int u)
 37 {
 38     int v,i;
 39     DFN[u] = Low[u] = ++ tot;
 40     stack[top++] = u;
 41     in[u] = 1;
 42     for(i = first[u];i != -1;i = edge[i].next)
 43     {
 44         v = edge[i].v;
 45         if(vis[i]) continue;
 46         vis[i] = vis[i^1] = 1;
 47         if(!DFN[v])
 48         {
 49             Tarjan(v);
 50             Low[u] = min(Low[u],Low[v]);
 51         }
 52         else
 53         {
 54             Low[u] = min(Low[u],DFN[v]);
 55         }
 56     }
 57     if(DFN[u] == Low[u])
 58     {
 59         scnt ++;
 60         do
 61         {
 62             v = stack[--top];
 63             Belong[v] = scnt;
 64             in[v] = 0;
 65             cnum[scnt] ++;
 66         }while(u != v);
 67     }
 68 }
 69 int find(int x)
 70 {
 71     int r,t;
 72     r = x;
 73     while(o[x] != x)
 74     x = o[x];
 75     while(r != x)
 76     {
 77         t = o[r];
 78         o[r] = x;
 79         r = t;
 80     }
 81     return x;
 82 }
 83 void merge(int x,int y)
 84 {
 85     x = find(x);
 86     y = find(y);
 87     if(x != y)
 88     o[x] = y;
 89 }
 90 int main()
 91 {
 92     int n,m,i,u,v,w,minz;
 93     while(scanf("%d%d",&n,&m)!=EOF)
 94     {
 95         if(n == 0&&m == 0) break;
 96         CL();
 97         for(i = 1;i <= n;i ++)
 98         {
 99             o[i] = i;
100         }
101         for(i = 0;i < m;i ++)
102         {
103             scanf("%d%d%d",&u,&v,&w);
104             qu[i] = u;
105             qv[i] = v;
106             qw[i] = w;
107             merge(u,v);
108             add(u,v,w);
109             add(v,u,w);
110         }
111         int fa = find(1);
112         for(i = 2;i <= n;i ++)
113         {
114             if(find(i) != fa)
115             break;
116         }
117         if(i != n+1)
118         {
119             printf("0
");
120             continue;
121         }
122         minz = 10000000;
123         Tarjan(1);
124         for(i = 0;i < m;i ++)
125         {
126             if(Belong[qu[i]] != Belong[qv[i]])
127             {
128                 minz = min(minz,qw[i]);
129             }
130         }
131         if(scnt == 1)
132         printf("-1
");
133         else
134         {
135             if(minz == 0)
136             printf("1
");
137             else
138             printf("%d
",minz);
139         }
140     }
141 
142 }
原文地址:https://www.cnblogs.com/naix-x/p/3325961.html