HDU 4738 Caocao's Bridges(Tarjan)

时间:2023-03-09 04:57:18
HDU 4738 Caocao's Bridges(Tarjan)

题目链接

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cstdlib>
using namespace std;
#define N 1001
#define M 20000001
#define INF 0x3f3f3f3f
struct node
{
int u,v,next;
}edge[M];
int first[N],DFN[N],Belong[N],stack[N],Low[N],cnum[N];
int in[N],d[N];
int qu[M],qv[M],qw[M];
int n,m;
bool vis[M];
int tot,scnt,top;
int o[M];
void CL()
{
tot = scnt = top = ;
memset(first,-,sizeof(first));
memset(in,,sizeof(in));
memset(DFN,,sizeof(DFN));
memset(vis,,sizeof(vis));
}
void add(int u,int v,int w)
{
edge[tot].u = u;
edge[tot].v = v;
edge[tot].next = first[u];
first[u] = tot ++;
}
void Tarjan(int u)
{
int v,i;
DFN[u] = Low[u] = ++ tot;
stack[top++] = u;
in[u] = ;
for(i = first[u];i != -;i = edge[i].next)
{
v = edge[i].v;
if(vis[i]) continue;
vis[i] = vis[i^] = ;
if(!DFN[v])
{
Tarjan(v);
Low[u] = min(Low[u],Low[v]);
}
else
{
Low[u] = min(Low[u],DFN[v]);
}
}
if(DFN[u] == Low[u])
{
scnt ++;
do
{
v = stack[--top];
Belong[v] = scnt;
in[v] = ;
cnum[scnt] ++;
}while(u != v);
}
}
int find(int x)
{
int r,t;
r = x;
while(o[x] != x)
x = o[x];
while(r != x)
{
t = o[r];
o[r] = x;
r = t;
}
return x;
}
void merge(int x,int y)
{
x = find(x);
y = find(y);
if(x != y)
o[x] = y;
}
int main()
{
int n,m,i,u,v,w,minz;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n == &&m == ) break;
CL();
for(i = ;i <= n;i ++)
{
o[i] = i;
}
for(i = ;i < m;i ++)
{
scanf("%d%d%d",&u,&v,&w);
qu[i] = u;
qv[i] = v;
qw[i] = w;
merge(u,v);
add(u,v,w);
add(v,u,w);
}
int fa = find();
for(i = ;i <= n;i ++)
{
if(find(i) != fa)
break;
}
if(i != n+)
{
printf("0\n");
continue;
}
minz = ;
Tarjan();
for(i = ;i < m;i ++)
{
if(Belong[qu[i]] != Belong[qv[i]])
{
minz = min(minz,qw[i]);
}
}
if(scnt == )
printf("-1\n");
else
{
if(minz == )
printf("1\n");
else
printf("%d\n",minz);
}
} }