I - Caocao’s Bridges HDU - 4738(求边双连通)
题目:传送门
思路见注释
代码 :
/* if 图不连通:ans=0 eles if 无桥:ans=-1 else ans=权值最小的桥==0?1:ans */
#include<bits/stdc++.h>
#define mset(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int N=5e4+10;
const int inf=0x3f3f3f3f;
vector<P> cute;
vector<P> g[N];
int low[N],dfn[N],tol,ans;
void tarjan(int u,int fa)
{
low[u]=dfn[u]=++tol;
bool infa=false;
for(P &e:g[u])
{
int v=e.first,w=e.second;
if(v==fa&&infa==false)
{
infa=true;
continue;
}
if(!dfn[v])
{
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>low[u]) {
cute.push_back({u,v});
ans=min(ans,w);
}
}
else low[u]=min(low[u],dfn[v]);
}
}
int solve(int n)
{
tol=0,ans=inf;
mset(dfn,0);
int connet_tot=0;
for(int i=1; i<=n; ++i)
{
if(!dfn[i])
{
connet_tot++;
if(connet_tot>1) return 0;
tarjan(i,i);
}
}
if(ans==inf) return -1;
return ans==0?1:ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
while(cin>>n>>m,n)
{
for(int i=1; i<=n; ++i) g[i].clear();
for(int i=1; i<=m; ++i)
{
int u,v,w;
cin>>u>>v>>w;
g[u].push_back({v,w});
g[v].push_back({u,w});
}
cout<<solve(n)<<endl;
}
return 0;
}