日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

poj_2762,弱连通

發布時間:2023/11/27 生活经验 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj_2762,弱连通 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://poj.org/problem?id=2762

這題是求弱連通

弱連通就是無向圖強連通(基圖是有向圖)

思路:先targan縮點,然后這些點求最長鏈

也就是這些點(縮點)在一棵樹上,這棵樹的深度應該為強連通分量個數。。

畫個圖就好理解了

#include<cstdio>
#include<cstring>const int maxn(1111);
struct Edge{int v, next;
}e1[maxn*6], e2[maxn*6];
int head1[maxn], cnt1, head2[maxn], cnt2;
int low[maxn], dfn[maxn], vis[maxn], belong[maxn];
int stack[maxn], step, color, top;
void init(){memset(head1, -1, sizeof head1);cnt1 = cnt2 = 0;memset(head2, -1, sizeof head2);memset(vis, 0, sizeof vis);memset(dfn, 0, sizeof dfn);memset(belong, -1, sizeof belong);step = color = top = 0;
}
void add_Edge(int u, int v){e1[cnt1].v = v, e1[cnt1].next = head1[u];head1[u] = cnt1 ++;
}
int n, m;
int f[maxn][maxn], ind[maxn];void targan(int u){dfn[u] = low[u] = ++ step;stack[top++] = u;vis[u] = 1;for(int i = head1[u]; i != -1; i = e1[i].next){int v = e1[i].v;if(!dfn[v]){targan(v);if(low[u] > low[v])low[u] = low[v];}elseif(vis[v] && low[u] > dfn[v])low[u] = dfn[v];}if(dfn[u] == low[u]){color ++;int s;do{s = stack[--top];vis[s] = 0;belong[s] = color;}while(s != u);}
}
void add_edge(int u, int v){e2[cnt2].v = v, e2[cnt2].next = head2[u];head2[u] = cnt2 ++;
}
int dp[maxn];
int cnt;
void dfs(int u){for(int i = head2[u]; i + 1; i = e2[i].next){int v = e2[i].v;if(dp[v] < dp[u] + 1)dp[v] = dp[u] + 1;if(dp[v] > cnt) cnt = dp[v];dfs(v);}
}
int check(){cnt = 0;int u;for(int i = 1; i <= color; i ++){if(ind[i] == 0){cnt ++;if(cnt > 1) return 0;u = i;}}/*cnt = 1;printf("%d\n", e2[u].next);while(e2[u].next != -1){cnt ++;u = e2[u].v;puts("|asdf");}*/memset(dp, 0, sizeof dp);cnt = 0;dfs(u);if(cnt == color - 1) return 1;return 0;
}
void solve(){for(int i = 1; i <= n; i ++)if(!dfn[i])targan(i);if(color == 1){puts("Yes");return;}memset(ind, 0, sizeof ind);memset(f, 0, sizeof f);for(int i = 1; i <= n; i ++){for(int j = head1[i]; j + 1; j = e1[j].next){int v = e1[j].v;int u = belong[i];v = belong[v];if(u != v && !f[u][v]){add_edge(u, v);ind[v] ++;f[u][v] = 1;}}}if(check())puts("Yes");elseputs("No");
}
int main(){int tcase;scanf("%d", &tcase);while(tcase --){init();scanf("%d%d", &n, &m);while(m --){int u, v;scanf("%d%d", &u, &v);add_Edge(u, v);}solve();}return 0;
}
/*
1
7 8
1 2
3 1
3 2
2 4
4 7
4 5
5 6
6 4
YES
*/

轉載于:https://www.cnblogs.com/louzhang/archive/2012/09/06/2673224.html

總結

以上是生活随笔為你收集整理的poj_2762,弱连通的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。