您的位置:首页 > 其它

关于图连通性的几道题(水)

2014-08-10 22:00 113 查看
POJ 2186 强连通分量缩点

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int inf = 2147483647;
int esize, n, m, dtime, ans;
int low[1010], dfn[1010], en[1010], f[1010];
struct edge{
int v, n, w;
bool u;
} e[2002000];
int getf(int x)
{
if (x == f[x]) return x;
f[x] = getf(f[x]);
return f[x];
}
void unionxy(int x, int y)
{
int xroot = getf(x),
yroot = getf(y);
f[xroot] = yroot;
}
void insert(int u, int v, int w){
e[esize].v = v;
e[esize].n = en[u];
e[esize].w = w;
e[esize].u = false;
en[u] = esize ++;
}
void dfs(int u)
{
low[u] = dfn[u] = dtime ++;
for (int t = en[u]; t != -1; t = e[t].n){
if (e[t^1].u) continue;
e[t].u = true;
int v = e[t].v;
if (!dfn[v]){
dfs(v);
low[u] = min(low[u], low[v]);
if (low[v] > dfn[u]){
if (e[t].w == 0)
ans = min(ans, 1);
else
ans = min(ans, e[t].w);
}
}
else
low[u] = min(low[u], dfn[v]);
}
}
int main()
{
while(scanf("%d %d", &n, &m) && (n + m))
{
memset(en, -1, sizeof(en));
esize = 0;
for (int i = 1; i <= n; i++)
f[i] = i;
int x, y, w;
for (int i = 0; i < m; i++){
scanf("%d %d %d", &x, &y, &w);
insert(x, y, w);
insert(y, x, w);
unionxy(x, y);
}
int cnt = 0;
for (int i = 1; i <= n; i++)
if (f[i] == i) cnt ++;
if (cnt > 1){
puts("0");
continue;
}
memset(dfn, 0, sizeof(dfn));
dtime = 1, ans = inf;
for (int i = 1; i <= n; i++)
if (!dfn[i]) dfs(i);
if (ans == inf) ans = -1;
printf("%d\n", ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: