标签:
一眼题:找所有的桥,然后求最小权值
但是有很多坑点
1:如果本来不联通 输出0,(这个坑我知道)
2:但是还有一个坑,就是当整个连通,最小桥的权值是0时,也必须派一个人去,wa了无数遍(还是太年轻)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <string> #include <stack> #include <vector> #include <map> #include <queue> #include <algorithm> #include <utility> using namespace std; typedef long long LL; const int N=1e3+5; const int INF=0x3f3f3f3f; struct Edge{ int w,v,next; }edge[N*N*2]; int head[N],tot,n,m; void add(int u,int v,int w){ edge[tot].w=w; edge[tot].v=v; edge[tot].next=head[u]; head[u]=tot++; } bool instack[N]; int dfn[N],low[N],clk,cnt,ans; void targin(int u,int f){ dfn[u]=low[u]=++clk; bool flag=1; for(int i=head[u];~i;i=edge[i].next){ int v=edge[i].v; if(flag&&v==f){ flag=0;continue; } if(!dfn[v]){ targin(v,u); low[u]=min(low[u],low[v]); if(low[v]>dfn[u]){ ans=min(ans,edge[i].w); } } else if(dfn[v]<low[u])low[u]=dfn[v]; } } int main() { while(~scanf("%d%d",&n,&m)){ if(!n&&!m)break; memset(head,-1,sizeof(head)); memset(dfn,0,sizeof(dfn)); tot=clk=0;ans=INF; for(int i=1;i<=m;++i){ int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w);add(v,u,w); } bool flag=0; for(int i=1;i<=n;++i) if(!dfn[i]){ targin(i,-1); if(i>1)flag=1; } if(flag)ans=0; else if(ans==0)ans=1; if(ans==INF)printf("-1\n"); else printf("%d\n",ans); } return 0; }
HDU4738 Caocao's Bridges 无向图的桥
标签:
原文地址:http://www.cnblogs.com/shuguangzw/p/5503575.html