#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <algorithm>
#include <map>
#include <functional>
#include <queue>
#include <vector>
#include <cstdlib>
#include <string>
#include <set>
#include <cmath>
using namespace std;
const int N=1010;
const long long M=150005;
const int INF=1000000000;
struct Node
{
int to, w;
}tmpp;
vector<Node> gg[N];
int head[N], cnt=0;
void add(int u, int v, int ww)
{
tmpp.to=v;
tmpp.w=ww;
gg[u].push_back(tmpp);
//cnt++;
}
int dfn[N], low[N], st[N], bel[N];
bool inst[N];
int ID, IDT, top;
void tarjan(int u, int fa)
{
dfn[u]=low[u]=++IDT;
st[top++]=u;inst[u]=1;
int first=1;
for(int i=0;i<gg[u].size();++i)
{
int v=gg[u][i].to;
if(v==fa&&first)
{
first=0;
//cout<<"-----\n";
continue;
}
if(!dfn[v])
{
tarjan(v, u);
low[u]=min(low[u], low[v]);
}
else if(inst[v])
low[u]=min(low[u], dfn[v]);
}
if(low[u]==dfn[u])
{
ID++;int v;
do
{
v=st[--top];inst[v]=0;bel[v]=ID;
}while(v!=u);
}
}
int n,m;
void init()
{
memset(inst, 0, sizeof(inst));
memset(dfn, 0, sizeof(dfn));
top=ID=IDT=0;
//memset(head, -1, sizeof(head));
cnt=0;
}
int solve()
{
init();
int id=0;
for(int i=1;i<=m;i++)
{
int u, v, w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);add(v,u,w);
}
int num=0;
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i, -1), num++;
if(num>1)return 0;
if(ID==1)return -1;
int ans=INF;
for(int i=1;i<=n;i++)
{
for (int j=0;j<gg[i].size(); ++j)
{
int u=bel[i], v=bel[gg[i][j].to];
if(u!=v)
ans=min(ans, gg[i][j].w);
}
}
if(ans==0)
return 1;
//if(ans>=INF)return -1;
return ans;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)break;
for (int i=0; i<N; ++i)
{
gg[i].clear();
}
printf("%d\n", solve());
}
return 0;
}
hdu 4738 Caocao's Bridges(求割边和桥)
最新推荐文章于 2023-03-05 20:16:10 发布