[hdu4738]求桥模板

oj问题,待修改,存档。

 1 #include<stdio.h>  
 2 #include<iostream>  
 3 #include<cstdio>  
 4 #include<stack>  
 5 using namespace std;  
 6 #define maxn 111111  
 7 #define inf 11111111  
 8 stack<int>s;  
 9 int dfn[maxn],low[maxn];  
10 int iscut[maxn];  
11 int cnt,scc,ans,clc;  
12 struct edge{  
13     int to,next,w,id;  
14 }e[maxn*10];  
15 int head[maxn];  
16 void add(int u,int v,int w,int id){  
17     e[cnt].to=v;e[cnt].next=head[u];e[cnt].w=w;e[cnt].id=id;  
18     head[u]=cnt++;  
19 }  
20 void init(){  
21     memset(dfn,0,sizeof dfn);  
22     memset(low,0,sizeof low);  
23     memset(head,-1,sizeof head);  
24     memset(iscut,0,sizeof iscut);  
25     cnt=0;scc=0,clc=0;  
26 }  
27 void dfs(int u,int fa){  
28     low[u]=dfn[u]=++clc;  
29     for(int i=head[u];i!=-1;i=e[i].next){  
30         int v=e[i].to;  
31         if(e[i].id==fa)continue;
32         if(!dfn[v]){  
33              dfs(v,e[i].id);  
34              low[u]=min(low[u],low[v]);  
35               if(low[v]>dfn[u]){  
36                   ans=min(ans,e[i].w);  
37               }  
38         }  
39         else low[u]=min(low[u],dfn[v]);  
40     }  
41 }  
42 int n,m,a,b,c;  
43 int main(){  
44     while(~scanf("%d%d",&n,&m)){  
45         if(!n&&!m)break;  
46         init();  
47         for(int i=1;i<=m;++i){  
48             scanf("%d%d%d",&a,&b,&c);  
49             add(a,b,c,i);  
50             add(b,a,c,i);  
51         }  
52         int blo=0;ans=inf;  
53         for(int i=1;i<=n;++i)  
54             if(!dfn[i]){  
55                 blo++;  
56                 dfs(i,-1);  
57             }  
58         if(blo>1)printf("0
");  
59         else if(!ans)printf("1
");  
60         else if(ans==inf)printf("-1
");  
61         else printf("%d
",ans);  
62     }  
63     return 0;  
64 }  
原文地址:https://www.cnblogs.com/elpsycongroo/p/7698315.html