标签:
http://acm.hdu.edu.cn/showproblem.php?pid=4738
题目大意:
给定n个点和m条边 和每条边的价值,求桥的最小价值(最小桥)
看着挺简单的但是有好多细节:
1、会有重边
2、如果最小价值是0的话应该输出1
3、m条边有可能不能连通n个点,这个时候没有花费。
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3108 Accepted Submission(s): 982
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<stack> #include<queue> #include<vector> using namespace std; #define N 1010 #define INF 0x3f3f3f3f struct node { int to,flew,next; }edge[N*N]; int low[N],dfn[N],Time,top,ans,Stack[N],belong[N],sum,head[N]; void Inn() { memset(low,0,sizeof(low)); memset(dfn,0,sizeof(dfn)); memset(Stack,0,sizeof(Stack)); memset(belong,0,sizeof(belong)); memset(head,-1,sizeof(head)); Time=top=ans=sum=0; } void add(int from,int to,int flew) { edge[ans].to=to; edge[ans].flew=flew; edge[ans].next=head[from]; head[from]=ans++; } void Tarjin(int u,int f) { int v,k=0; low[u]=dfn[u]=++Time; Stack[top++]=u; for(int i=head[u];i!=-1;i=edge[i].next) { v=edge[i].to; if(v==f && !k) { k++; continue; } if(!dfn[v]) { Tarjin(v,u); low[u]=min(low[u],low[v]); } else low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]) { sum++; do { v=Stack[--top]; belong[v]=sum; }while(v!=u); } } void solve(int n) { int k=0; int Min=INF; for(int i=1;i<=n;i++) { if(!dfn[i]) { k++; Tarjin(i,0); } } if(sum==1) { printf("-1\n"); return; } if(k>1) { printf("0\n"); return; } for(int i=1;i<=n;i++) { for(int j=head[i];j!=-1;j=edge[j].next) { int u=belong[i]; int v=belong[edge[j].to]; if(u!=v) { Min=min(Min,edge[j].flew); } } } if(Min==0) Min++; printf("%d\n",Min); } int main() { int n,m,a,b,c,i; while(scanf("%d %d",&n,&m),n+m) { Inn(); for(i=0;i<m;i++) { scanf("%d %d %d",&a,&b,&c); add(a,b,c); add(b,a,c); } solve(n); } return 0; }
Caocao's Bridges-HDU4738(Tarjin+求桥)
标签:
原文地址:http://www.cnblogs.com/linliu/p/4932955.html