模板题 注意去重边的处理
#include <bits/stdc++.h>
using namespace std;
#define N 0x3f3f3f3f
struct node
{
int v;
int w;
int next;
int flag;
};
node edge[2000010];
int f[1010],first[1010],dfn[1010],low[1010];
int n,m,num;
void addedge(int u,int v,int w)
{
edge[num].v=v;
edge[num].w=w;
edge[num].next=first[u];
edge[num].flag=0;
first[u]=num++;
return;
}
int getf(int p)
{
if(f[p]==p) return p;
else
{
f[p]=getf(f[p]);
return f[p];
}
}
void unite(int u,int v)
{
int fu,fv;
fu=getf(u);
fv=getf(v);
if(fu!=fv) f[fv]=fu;
return;
}
void dfs(int cur,int pre)
{
int cnt,i,v;
num++;
dfn[cur]=num,low[cur]=num;
cnt=0;
for(i=first[cur];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(dfn[v]==0)
{
dfs(v,cur);
low[cur]=min(low[cur],low[v]);
if(low[v]>dfn[cur])
{
edge[i].flag=1;
edge[i^1].flag=1;
}
}
else if(v==pre)
{
if(cnt>0) low[cur]=min(low[cur],dfn[v]);
cnt++;
}
else
{
low[cur]=min(low[cur],dfn[v]);
}
}
return;
}
int main()
{
int i,u,v,w,cnt,ans;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
memset(first,-1,sizeof(first));
for(i=1;i<=n;i++) f[i]=i;
num=0;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
unite(u,v);
}
cnt=0;
for(i=1;i<=n;i++)
{
if(f[i]==i) cnt++;
}
if(cnt>1)
{
printf("0\n");
continue;
}
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
num=0;
dfs(1,-1);
cnt=0,ans=N;
for(u=1;u<=n;u++)
{
for(i=first[u];i!=-1;i=edge[i].next)
{
if(edge[i].flag)
{
w=edge[i].w,cnt++;
ans=min(ans,w);
}
}
}
if(cnt>0) printf("%d\n",max(ans,1));
else printf("-1\n");
}
return 0;
}