hdu 4738

时间:2023-03-09 06:35:42
hdu 4738

桥的应用!

虽然以前做过强联通分量的题,但刷的很水,所以比赛的时候一直想不起来是桥的应用;

反省一下~~~学习一下!

思路,找到权值最小的桥;用tarjin算法!

代码:

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1003
using namespace std; struct edge
{
int st,ed,w,next;
}e[maxn*maxn*]; int head[maxn],dfn[maxn],low[maxn],nncount,best,num,dan; void addedge(int x,int y,int w)
{
e[num].st=x,e[num].ed=y,e[num].w=w,e[num].next=head[x],head[x]=num++;
e[num].st=y,e[num].ed=x,e[num].w=w,e[num].next=head[y],head[y]=num++;
} void tarjin(int x,int id)
{
int v;
dfn[x]=low[x]=nncount++;
for(int i=head[x]; i!=-; i=e[i].next)
{
int v=e[i].ed;
if(i==(id^)) continue;
if(dfn[v]==-)
{
tarjin(v,i);
low[x]=min(low[v],low[x]);
if(low[v]>dfn[x])
if(best>e[i].w)
best=e[i].w;
}
else low[x]=min(dfn[v],low[x]);
}
dan++;
} int main()
{
int n,m,a,b,w;
while(scanf("%d%d",&n,&m)&&(n+m))
{
memset(dfn,-,sizeof dfn);
num=,nncount=,dan=;
best=;
memset(head,-,sizeof head);
for(int i=; i<m; i++)
{
scanf("%d%d%d",&a,&b,&w);
addedge(a,b,w);
}
tarjin(,-);
if(dan<n)puts("");
else if(best==) puts("-1");
else if(best==) puts("");
else printf("%d\n",best);
}
return ;
}