一眼题:找所有的桥,然后求最小权值

但是有很多坑点

1:如果本来不联通 输出0,(这个坑我知道)

2:但是还有一个坑,就是当整个连通,最小桥的权值是0时,也必须派一个人去,wa了无数遍(还是太年轻)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <string>
#include <stack>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#include <utility>
using namespace std;
typedef long long LL;
const int N=1e3+;
const int INF=0x3f3f3f3f;
struct Edge{
int w,v,next;
}edge[N*N*];
int head[N],tot,n,m;
void add(int u,int v,int w){
edge[tot].w=w;
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
}
bool instack[N];
int dfn[N],low[N],clk,cnt,ans;
void targin(int u,int f){
dfn[u]=low[u]=++clk;
bool flag=;
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].v;
if(flag&&v==f){
flag=;continue;
}
if(!dfn[v]){
targin(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]){
ans=min(ans,edge[i].w);
}
}
else if(dfn[v]<low[u])low[u]=dfn[v];
}
}
int main()
{
while(~scanf("%d%d",&n,&m)){
if(!n&&!m)break;
memset(head,-,sizeof(head));
memset(dfn,,sizeof(dfn));
tot=clk=;ans=INF;
for(int i=;i<=m;++i){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);add(v,u,w);
}
bool flag=;
for(int i=;i<=n;++i)
if(!dfn[i]){
targin(i,-);
if(i>)flag=;
}
if(flag)ans=;
else if(ans==)ans=;
if(ans==INF)printf("-1\n");
else printf("%d\n",ans);
}
return ;
}
05-11 20:14