[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\n"); 59 else if(!ans)printf("1\n"); 60 else if(ans==inf)printf("-1\n"); 61 else printf("%d\n",ans); 62 } 63 return 0; 64 }