题意:给出一个无向图和每条边的权值,现在破坏一条路使得图不再联通,只能破坏一条路,问最少需要的花费,花费为边上的权值,注意的是,图刚开始可能不连通,输出1;花费最小的边为0输出1,其他没什么了
思路:求桥的模版题,在找到一个桥时更新费用最小,对了还有一个可能有重边,简单~~~
#include <vector> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const int maxn=1010; struct edge{ int to,cost; edge(int a,int b){to=a;cost=b;} }; vector<edge>G[maxn]; int L[maxn],E[maxn],stack1[maxn],vis[maxn]; int v[maxn][maxn],cnt,vv[maxn]; int n,m,k,kk,max1,top; void dfs(int x,int fa){ vis[x]=1;L[x]=k;E[x]=k++; for(unsigned int i=0;i<G[x].size();i++){ edge e=G[x][i]; if(!vis[e.to]){ dfs(e.to,x); L[x]=min(L[x],L[e.to]); if(L[e.to]>E[x]&&v[x][e.to]==1){ max1=min(max1,e.cost); kk++; } }else if(e.to!=fa) L[x]=min(L[x],E[e.to]); } } int tarjan(){ k=0;kk=0;dfs(1,1); return kk; } void dfs1(int x){ vv[x]=1;cnt++; for(unsigned int i=0;i<G[x].size();i++){ edge e=G[x][i]; if(!vv[e.to]) dfs1(e.to); } } int main(){ int a,b,c; while(scanf("%d%d",&n,&m)!=-1){ if(n==0&&m==0) break; for(int i=0;i<maxn;i++){ G[i].clear();vis[i]=0;E[i]=0;vv[i]=0; } memset(v,0,sizeof(v)); for(int i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&c); G[a].push_back(edge(b,c)); G[b].push_back(edge(a,c)); v[a][b]++;v[b][a]++; } cnt=0;max1=inf; dfs1(1); if(cnt!=n){ printf("0\n"); continue; } int ans=tarjan(); if(ans==0) printf("-1\n"); else if(max1==0) printf("1\n"); else printf("%d\n",max1); } return 0; }
时间: 2024-10-29 19:09:38