[HDU4738]Caocao's Bridges(求割边最小权值)
Posted wifimonster
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[HDU4738]Caocao's Bridges(求割边最小权值)相关的知识,希望对你有一定的参考价值。
http://acm.hdu.edu.cn/showproblem.php?pid=4738
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1e3+4,maxm=1e6+4; int dfn[maxn],low[maxn],head[maxn]; int n,m,cnt=0,rt,ans,tim; struct node{ int to,next,w; }e[maxm<<1]; inline void add(int u,int v,int w){ e[cnt].to=v;e[cnt].next=head[u];head[u]=cnt;e[cnt].w=w;cnt++; } inline void tarjan(int u,int pre){ dfn[u]=low[u]=++tim; for(int i=head[u];i!=-1;i=e[i].next){ if(i==(pre^1)) continue; int v=e[i].to; if(!dfn[v]) { tarjan(v,i); low[u]=min(low[u],low[v]); if(low[v]==dfn[v]){ ans=min(ans,e[i].w); } }else low[u]=min(low[u],dfn[v]); } } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ if(n==0&&m==0) return 0; cnt=0;tim=0;ans=0x3f3f3f3f; memset(head,-1,sizeof(head)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(e,0,sizeof(e)); 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); } int flag=0; for(int i=1;i<=n;i++){ if(!dfn[i]) { if(flag) {ans=-1;break;} flag=1; tarjan(i,0x3f3f3f3f); } } if(ans==-1) printf("0 "); else if(ans==0) printf("1 "); else if(ans==0x3f3f3f3f) printf("-1 "); else printf("%d ",ans); } }
以上是关于[HDU4738]Caocao's Bridges(求割边最小权值)的主要内容,如果未能解决你的问题,请参考以下文章
[HDU4738]Caocao's Bridges(求割边最小权值)
HDU4738 Caocao's Bridges 无向图的桥
kuangbin专题 专题九 连通图 HDU 4738 Caocao's Bridges