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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

强连通分量(学习心得)

發布時間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 强连通分量(学习心得) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

定義:有向圖強連通分量:在有向圖G中,如果兩個頂點vi,vj間(vi>vj)有一條從vi到vj的有向路徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強連通如果有向圖G的每兩個頂點都強連通,稱G是一個強連通圖。有向圖的極大強連通子圖,稱為強連通分量。

求強連通分量:

vector<int>pic[maxn]; int dfn[maxn],low[maxn],ans[maxn]; bool ins[maxn]; stack<int>st; int dind=0,block=0; int siz[maxn],cud[maxn]; void tarjan(int x) {dind++;dfn[x]=low[x]=dind;ins[x]=true;st.push(x);for (int j=0;j<pic[x].size();j++){int y=pic[x][j];if (dfn[y]==0){tarjan(y);low[x]=min(low[x],low[y]);}else if (ins[y]) low[x]=min(low[x],dfn[y]);}if (low[x]==dfn[x]){block++;siz[block]=0;while (true){int thi=st.top();st.pop();ans[thi]=block;siz[block]++;ins[thi]=false;if (thi==x) break;}} }

  例題1【UVA-11324 最大團】

分析:先計算強連通分量,然后建一張新圖,每個點的權值是它所包含的點的數量,求圖的最長鏈。

代碼:

#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<stack> using namespace std; const int maxn=1010; vector<int> pic[maxn],new_[maxn]; int dfn[maxn],low[maxn],ans[maxn]; bool ins[maxn]; stack<int>st; int dind=0,block=0; int siz[maxn],dp[maxn],Ans; void tarjan(int x) {dind++;dfn[x]=low[x]=dind;ins[x]=true;st.push(x);for (int j=0;j<pic[x].size();j++){int y=pic[x][j];if (!dfn[y]){tarjan(y);low[x]=min(low[x],low[y]);}else if (ins[y]) low[x]=min(low[x],dfn[y]);}if (low[x]==dfn[x]){block++;siz[block]=0;while (true){int thi=st.top();st.pop();ans[thi]=block;siz[block]++;ins[thi]=false;if (thi==x) break;}} } int DP(int x){ if(dp[x]!=-1) return dp[x];int Max=0; for(int i=0;i<new_[x].size();i++) Max=max(Max,DP(new_[x][i])); return dp[x]=siz[x]+Max; } void init(int n){for(int i=1;i<=n;i++) pic[i].clear(),new_[i].clear();memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low));memset(ans,0,sizeof(ans)); memset(ins,0,sizeof(ins));while(!st.empty()) st.pop(); dind=block=Ans=0;memset(siz,0,sizeof(siz)); memset(dp,-1,sizeof(dp)); } int main(){int n,m,N,u,v;scanf("%d",&N);while(N--){scanf("%d%d",&n,&m);init(n);while(m--){scanf("%d%d",&u,&v);pic[u].push_back(v);}for(int i=1;i<=n;i++)if(!dfn[i]) tarjan(i);for(int i=1;i<=n;i++)for(int j=0;j<pic[i].size();j++)if(ans[i]!=ans[pic[i][j]]) new_[ans[pic[i][j]]].push_back(ans[i]);for(int i=1;i<=block;i++) Ans=max(Ans,DP(i));printf("%d\n",Ans);}return 0; }

  例題2【POJ 1236 學校網絡】

第一問:縮點后求入度為0的結點數量;

第二問:對于一張有向無環圖,可以通過把葉子結點連向根節點使它強連通;

like this:

所以需要連的邊數量為max(葉節點,根節點);

葉節點是出度為0的點,根節點是入度為0的點;

注意當只有一個強連通分量時,需要特判,為0;

代碼:

#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<stack> #include<set> using namespace std; const int maxn=110; vector<int> pic[maxn]; int dfn[maxn],low[maxn],ans[maxn]; bool ins[maxn]; stack<int>st; set<int>check[maxn]; int dind=0,block=0; int siz[maxn]; int ans1,in[maxn],out[maxn];void tarjan(int x) {dind++;dfn[x]=low[x]=dind;ins[x]=true;st.push(x);for (int j=0;j<pic[x].size();j++){int y=pic[x][j];if (!dfn[y]){tarjan(y);low[x]=min(low[x],low[y]);}else if (ins[y]) low[x]=min(low[x],dfn[y]);}if (low[x]==dfn[x]){block++;siz[block]=0;while (true){int thi=st.top();st.pop();ans[thi]=block;siz[block]++;ins[thi]=false;if (thi==x) break;}} } int main(){int n,i,j;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&j);while(j) pic[i].push_back(j),scanf("%d",&j); }for(int i=1;i<=n;i++)if(!dfn[i]) tarjan(i);for (i=1;i<=n;i++)for (j=0;j<pic[i].size();j++){int b1=ans[i],b2=ans[pic[i][j]];if (b1==b2) continue;if (check[b1].count(b2)) continue;check[b1].insert(b2);in[b2]++; out[b1]++;}int root=0,leaf=0;for(int i=1;i<=block;i++){if(!in[i]) root++;if(!out[i]) leaf++;}printf("%d\n",root);if(block==1) printf("0");else printf("%d",max(leaf,root));return 0; }

  類似的還有【HDU 2767】

很奇怪的是提交時出現了這樣尷尬的問題:

0_0_20950778_21662.cpp
0_0_20950778_21662.cpp(29) : error C3861: “min”:? 找不到標識符
0_0_20950778_21662.cpp(31) : error C3861: “min”:? 找不到標識符
0_0_20950778_21662.cpp(83) : error C3861: “max”:? 找不到標識符

然后在出錯的庫后面加上了#include "minmax.h",就過了?(莫名其妙)

代碼:

#include<iostream> #include "minmax.h" #include<cstdio> #include<cstring> #include<vector> #include<stack> #include<set> using namespace std; const int maxn=20010; vector<int> pic[maxn]; int dfn[maxn],low[maxn],ans[maxn]; bool ins[maxn]; stack<int>st; set<int>check[maxn]; int dind=0,block=0,siz[maxn]; int in[maxn],out[maxn],T; void tarjan(int x) {dind++;dfn[x]=low[x]=dind;ins[x]=true;st.push(x);for (int j=0;j<pic[x].size();j++){int y=pic[x][j];if (!dfn[y]){tarjan(y);low[x]=min(low[x],low[y]);}else if (ins[y]) low[x]=min(low[x],dfn[y]);}if (low[x]==dfn[x]){block++;siz[block]=0;while (true){int thi=st.top();st.pop();ans[thi]=block;siz[block]++;ins[thi]=false;if (thi==x) break;}} } void init(int n){for(int i=1;i<=n;i++) pic[i].clear(),check[i].clear();;memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low));memset(ans,0,sizeof(ans)); memset(ins,0,sizeof(ins));while(!st.empty()) st.pop(); dind=0;block=0; memset(siz,0,sizeof(siz));memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); } int main(){scanf("%d",&T);while(T--){int n,i,j,m;scanf("%d%d",&n,&m);init(n);for(i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);pic[x].push_back(y); }for(int i=1;i<=n;i++)if(!dfn[i]) tarjan(i);for (i=1;i<=n;i++)for (j=0;j<pic[i].size();j++){int b1=ans[i],b2=ans[pic[i][j]];if (b1==b2) continue;if (check[b1].count(b2)) continue;check[b1].insert(b2);in[b2]++; out[b1]++;}int root=0,leaf=0;for(int i=1;i<=block;i++){if(!in[i]) root++;if(!out[i]) leaf++;}if(block==1) printf("0\n");else printf("%d\n",max(leaf,root));}return 0; }

  ————————————————————————————————————————————————————————

?來自Paper Cloud的博客,未經允許,請勿轉載,謝謝

轉載于:https://www.cnblogs.com/PaperCloud/p/7113385.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的强连通分量(学习心得)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 永久免费看片在线播放 | 91亚洲视频 | 999国产精品 | 色日韩| 国产乱国产乱老熟300部视频 | 久久久久久欧美 | 久久精品无码一区二区三区 | 视频一区二区三 | 国产精品高清无码 | 国产成人精品免费 | 欧美激情片一区二区 | 国产女人18毛片18精品 | 国产日本欧美一区二区 | 中国二级毛片 | 日韩av在线网 | 超碰97成人 | 波多野结衣中文字幕久久 | 高清视频一区二区 | 欧美重口另类 | 阿v天堂在线观看 | 欧美成人精品在线视频 | 美国黄色一级视频 | 国产经典一区二区 | 欧美午夜精品久久久久久人妖 | 国产999精品久久久久久 | 日韩中文字幕 | www.桃色| 99久久人妻无码精品系列 | 久久婷婷成人综合色 | 尤物在线观看 | 美女张开腿让男人操 | 台湾综合色 | 日韩综合区 | 亚洲中文字幕无码av永久 | 久久香视频| 国产美女自慰在线观看 | 天堂8在线视频 | 日本不卡三区 | 男男车车的车车网站w98免费 | 男生操男生网站 | 黄色一级片欧美 | 欧美一区二区三区在线看 | 亚洲熟女乱色一区二区三区 | 国产精品久久久精品 | 成人爽a毛片一区二区免费 日本高清免费看 | 熟妇人妻va精品中文字幕 | 日本最黄网站 | 亚洲国产福利视频 | 人人爽人人干 | 最新91视频 | 性高潮久久久久 | av激情网站 | 久艹在线观看视频 | 熟女熟妇伦久久影院毛片一区二区 | 天天想夜夜操 | 欧美日韩免费视频 | 女人叫床高潮娇喘声录音mp3 | 蜜桃视频一区二区三区 | 色噜噜综合网 | 亚洲一二三级 | 久久国产精品影院 | 台湾佬中文字幕 | 国产成人aaaa| 国产一区精品视频 | 中文字幕一区二区三区波野结 | 精品国产视频一区二区三区 | 看了下面会湿的视频 | 波多野久久 | 国产在线网站 | 日韩色一区 | 国产情侣在线播放 | 国产一区二区在线电影 | 日韩第一页 | 午夜在线精品 | 日韩视频免费观看高清完整版在线观看 | 一区视频在线免费观看 | 欧美日韩国产三区 | 97伦伦午夜电影理伦片 | 豆花免费跳转入口官网 | 欧美日韩一二三 | 成人在线播放视频 | 中文字幕在线免费观看视频 | 亚洲日本韩国在线 | 国产成人自拍在线 | 性生活视频在线播放 | 亚洲97| 四虎永久在线观看 | 中文文字幕一区二区三三 | 亚洲精品中文字幕在线观看 | 午夜精品久久久久久久99 | 国产精品欧美性爱 | 狠狠狠狠狠狠狠干 | 午夜久久福利 | 亚洲精选免费 | 欧美揉bbbbb揉bbbbb | 亚洲欧美国产一区二区三区 | 97超碰碰| 午夜爱| 毛片内射久久久一区 |