题意:需要去干掉一些边 然后花费是最小桥的代价
解法:再无向图中使用tarjan 所满足条件low[v]>dfn[u]的就是桥了
这个判断很容易 关键是对于无向图中同一条边的判定 采用的方法是给边打序号
将一条无向边拆成是同编号的两条有向边就可以判断是否这一条是来时的边了
刚开始想的时候想到了重边 然后一直觉得程序不对 其实概念不清了 两点之间有重边的话
是不可能有桥的
#include<stdio.h>
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
#define maxn 111111
#define inf 11111111
stack<int>s;
int dfn[maxn],low[maxn];
int iscut[maxn];
int cnt,scc,ans,clc;
struct edge{
int to,next,w,id;
}e[maxn*10];
int head[maxn];
void add(int u,int v,int w,int id){
e[cnt].to=v;e[cnt].next=head[u];e[cnt].w=w;e[cnt].id=id;
head[u]=cnt++;
}
void init(){
memset(dfn,0,sizeof dfn);
memset(low,0,sizeof low);
memset(head,-1,sizeof head);
memset(iscut,0,sizeof iscut);
cnt=0;scc=0,clc=0;
}
void dfs(int u,int fa){
low[u]=dfn[u]=++clc;
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].to;
if(e[i].id==fa)continue;
if(!dfn[v]){
dfs(v,e[i].id);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]){
ans=min(ans,e[i].w);
}
}
else low[u]=min(low[u],dfn[v]);
}
}
int n,m,a,b,c;
int main(){
while(~scanf("%d%d",&n,&m)){
if(!n&&!m)break;
init();
for(int i=1;i<=m;++i){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c,i);
add(b,a,c,i);
}
int blo=0;ans=inf;
for(int i=1;i<=n;++i)
if(!dfn[i]){
blo++;
dfs(i,-1);
}
if(blo>1)printf("0\n");
else if(!ans)printf("1\n");
else if(ans==inf)printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}