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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

有向图——强连通分量

發布時間:2025/6/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 有向图——强连通分量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? 有向圖的強連通分量(strongly?connected components)

在有向圖G中,如果兩個頂點vi,vj間(vi!=vj)有一條從vi到vj的路徑,同時還有一條從vj到vi的路徑(頂點相互可達),則稱兩個頂點強連通。如果有向圖G的每對頂點都強連通,稱G是個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量。

??? 求解強連通分量的算法主要有三種:Kosaraju,Tarjan,Gabow。下面介紹Tarjan算法。

??? Tarjan算法基于圖的深度遍歷。定義dfn[u]是結點u的時間戳,low[u]為u和u的子樹能夠追溯到的最早的棧中結點的時間戳。

??? low[u] = min{dfn[u], low[v](u,v為樹枝邊,u為v的父節點), dfn[v](u,v為指向棧中結點的后向邊)};

??? 當dfn[u] == low[u]時,以u為根的搜索子樹上所有結點是一個強連通分量。

?

關于Tarjan算法的詳細介紹,參考:

http://hi.baidu.com/escorter2009/blog/item/f35951dc5bdb3de677c63826.html

?

POJ2186

題目大意:有n頭牛,每頭牛都希望自己受歡迎,輸入a b表示a認為b受歡迎。要求出受其它所有牛歡迎的牛的個數。

解:首先求強連通分量,分量中每頭牛都受分量中其它牛的歡迎。分量之間至多有一條有向邊。那么顯然需要找出出度為0的強連通分量,若有大于1的出度為0的強連通分量,這兩個連通分量互相不認為對方受歡迎,顯然個數為0;則有且僅有一個入讀度為0的強連通分量時,該強連通分量的結點數即為解。

Cpp代碼??
  • //出度為0的scc??
  • #include?<iostream>??
  • const?int?MAX?=?10002;??
  • int?n,m;??
  • int?low[MAX],dfn[MAX],seq;??
  • bool?inStack[MAX];??
  • struct?Edge??
  • {??
  • ????int?to;??
  • ????int?next;??
  • }e[50001];??
  • int?index[MAX],edgeNum;??
  • int?stack[MAX],top;??
  • int?belong[MAX];????????????????????//belong[i]表示結點i屬于的連通分量??
  • int?outdegree[MAX];???
  • int?cnt;????????????????????????????//cnt為當前強連通分量的標記值??
  • ??
  • int?min(int?x,?int?y)??
  • {??
  • ????return?x?<?y???x?:?y;??
  • }??
  • ??
  • void?addEdge(int?from,?int?to)??
  • {??
  • ????e[edgeNum].to?=?to;??
  • ????e[edgeNum].next?=?index[from];??
  • ????index[from]?=?edgeNum++;??
  • }??
  • ??
  • void?Tarjan(int?u)??
  • {??
  • ????low[u]?=?dfn[u]?=?seq++;??
  • ????stack[top++]?=?u;???????????????????????//將結點u入棧??
  • ????inStack[u]?=?true;??
  • ????for(int?i?=?index[u];?i?!=?-1;?i?=?e[i].next)??
  • ????{??
  • ????????int?w?=?e[i].to;??
  • ????????if(dfn[w]?<?0)??
  • ????????{??
  • ????????????Tarjan(w);??
  • ????????????low[u]?=?min(low[u],low[w]);??
  • ????????}??
  • ????????else?if(inStack[w])?????????????????//如果節點w還在棧內??
  • ????????????low[u]?=?min(low[u],dfn[w]);??
  • ????}??
  • ????if(dfn[u]?==?low[u])????????????????//u是強連通分量的根??
  • ????{??
  • ????????int?v;??
  • ????????cnt++;??
  • ????????//出棧,縮點??
  • ????????do??
  • ????????{??
  • ????????????top--;??
  • ????????????v?=?stack[top];??
  • ????????????inStack[v]?=?false;??
  • ????????????belong[v]?=?cnt;??
  • ????????}while(u?!=?v);??
  • ????}??
  • }??
  • ??
  • void?solve()??
  • {??
  • ????int?i,j;??
  • ????for(i?=?1;?i?<=?n;?i++)??
  • ????????if(dfn[i]?<?0)??
  • ????????????Tarjan(i);??
  • ????for(i?=?1;?i?<=?n;?i++)??
  • ????{??
  • ????????for(j?=?index[i];?j?!=?-1;?j?=?e[j].next)??
  • ????????{??
  • ????????????if(belong[i]?!=?belong[e[j].to])??
  • ????????????????outdegree[belong[i]]++;??
  • ????????}??
  • ????}??
  • ????int?num?=?0;????//出度為0的連通分量的個數??
  • ????int?who;????????//哪個連通分量??
  • ????for(i?=?1;?i?<=?cnt;?i++)??
  • ????{??
  • ????????if(outdegree[i]?==?0)??
  • ????????{??
  • ????????????who?=?i;??
  • ????????????num++;??
  • ????????}??
  • ????}??
  • ????if(num?!=?1)??
  • ????????printf("0\n");??
  • ????else??
  • ????{??
  • ????????int?result?=?0;??
  • ????????for(i?=?1;?i?<=?n;?i++)??
  • ????????????if(belong[i]==who)??
  • ????????????????result++;??
  • ????????printf("%d\n",result);??
  • ????}??
  • }??
  • ??
  • int?main()??
  • {??
  • ????int?i,j;??
  • ????int?from,to;??
  • ????edgeNum?=?0;??
  • ????seq?=?0;??
  • ????top?=?0;??
  • ????cnt?=?0;??
  • ????memset(dfn,-1,sizeof(dfn));??
  • ????memset(index,-1,sizeof(index));??
  • ????memset(inStack,0,sizeof(inStack));??
  • ????memset(outdegree,0,sizeof(outdegree));??
  • ????scanf("%d?%d",&n,&m);??
  • ????for(i?=?0;?i?<?m;?i++)??
  • ????{??
  • ????????scanf("%d?%d",&from,&to);??
  • ????????addEdge(from,to);??
  • ????}??
  • ????solve();??
  • ????return?0;??
  • }??
  • ?

    POJ2553

    題目大意:一個圖由結點集v和邊集E組成,現在要求出一個點集合:

    ??? bottom(G)={v∈V|?w∈V:(v→w)?(w→v)}(對于集合中的任意一點v和V中的任意一點w,如果v能到達w,那么w也能到達v)。

    解:首先求強連通分量,聯想到出度為0的scc(因為出度不為0的scc,不滿足集合的定義)。

    Cpp代碼??
  • //出度為0的所有scc??
  • #include?<iostream>??
  • const?int?MAX?=?5005;??
  • int?n,m;??
  • ??
  • struct?Edge??
  • {??
  • ????int?to;??
  • ????int?next;??
  • }e[MAX*MAX];??
  • int?index[MAX],edgeNum;??
  • ??
  • int?low[MAX],dfn[MAX],seq;??
  • int?stack[MAX],top;??
  • bool?inStack[MAX];??
  • int?belong[MAX],outdegree[MAX],cnt;??
  • int?result[MAX],count;??
  • ??
  • int?min(int?x,?int?y)??
  • {??
  • ????return?x?<?y???x?:?y;??
  • }??
  • ??
  • void?addEdge(int?from,?int?to)??
  • {??
  • ????e[edgeNum].to?=?to;??
  • ????e[edgeNum].next?=?index[from];??
  • ????index[from]?=?edgeNum++;??
  • }??
  • ??
  • void?Tarjan(int?u)??
  • {??
  • ????low[u]?=?dfn[u]?=?seq++;??
  • ????stack[top++]?=?u;??
  • ????inStack[u]?=?true;??
  • ????for(int?i?=?index[u];?i?!=?-1;?i?=?e[i].next)??
  • ????{??
  • ????????int?w?=?e[i].to;??
  • ????????if(dfn[w]?<?0)??
  • ????????{??
  • ????????????Tarjan(w);??
  • ????????????low[u]?=?min(low[u],low[w]);??
  • ????????}??
  • ????????else?if(inStack[w])?????????????????//如果節點w還在棧內??
  • ????????????low[u]?=?min(low[u],dfn[w]);??
  • ????}??
  • ????if(low[u]?==?dfn[u])??
  • ????{??
  • ????????int?v;??
  • ????????cnt++;??
  • ????????do??
  • ????????{??
  • ????????????top--;??
  • ????????????v?=?stack[top];??
  • ????????????inStack[v]?=?false;??
  • ????????????belong[v]?=?cnt;??
  • ????????}while(u?!=?v);??
  • ????}??
  • }??
  • ??
  • void?solve()??
  • {??
  • ????int?i,j;??
  • ????for(i?=?1;?i?<=?n;?i++)??
  • ????????if(dfn[i]?<?0)??
  • ????????????Tarjan(i);??
  • ????for(i?=?1;?i?<=?n;?i++)??
  • ????{??
  • ????????for(j?=?index[i];?j?!=?-1;?j?=?e[j].next)??
  • ????????{??
  • ????????????if(belong[i]?!=?belong[e[j].to])??
  • ????????????????outdegree[belong[i]]++;??
  • ????????}??
  • ????}??
  • ????for(i?=?1;?i?<=?n;?i++)??
  • ????{??
  • ????????if(outdegree[belong[i]]?==?0)??
  • ????????????result[count++]?=?i;??
  • ????}??
  • }??
  • ??
  • int?main()??
  • {??
  • ????int?i,j;??
  • ????int?from,to;??
  • ????while(true)??
  • ????{??
  • ????????scanf("%d",&n);??
  • ????????if(n==0)??
  • ????????????break;??
  • ????????edgeNum?=?top?=?seq?=?count?=?cnt?=0;??
  • ????????memset(dfn,-1,sizeof(dfn));??
  • ????????memset(index,-1,sizeof(index));??
  • ????????memset(inStack,0,sizeof(inStack));??
  • ????????memset(belong,0,sizeof(belong));??
  • ????????memset(outdegree,0,sizeof(outdegree));??
  • ????????scanf("%d",&m);??
  • ????????for(i?=?0;?i?<?m;?i++)??
  • ????????{??
  • ????????????scanf("%d?%d",&from,&to);??
  • ????????????addEdge(from,to);??
  • ????????}??
  • ????????solve();??
  • ????????if(count?==?0)??
  • ????????????printf("\n");??
  • ????????else??
  • ????????{??
  • ????????????for(i?=?0;?i?<?count-1;?i++)??
  • ????????????????printf("%d?",result[i]);??
  • ????????????printf("%d\n",result[i]);??
  • ????????}??
  • ????}??
  • ????return?0;??
  • } ?
  • 總結

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

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

    主站蜘蛛池模板: 黄网在线免费看 | 泰国午夜理伦三级 | 在线免费看黄色 | 精品欧美一区二区精品少妇 | 久久久久久久黄色片 | 日韩精品免费播放 | ww黄色 | 一区二区日韩av | av天天堂 | 久久久久亚洲av无码网站 | 婷婷伊人综合中文字幕 | 免费福利在线观看 | 亚洲日本视频 | 国产午夜伦鲁鲁 | 欧美日韩精品久久 | 亚洲精品一区二区三区蜜桃 | 免费看成人啪啪 | 成人免费性生活视频 | 天堂视频中文在线 | 久久av一区二区三区亚洲 | 久久久久毛片 | 天堂俺去俺来也www 欧美大片在线播放 | 久久精品99久久久久久 | 国产第页 | 性少妇videosexfre | 日本内谢少妇xxxxx少交 | 日本xx视频| 久久精品一本 | 欧美人一级淫片a免费播放 西方av在线 | 在线手机av| 国产欧美日 | 久久精品国产精品亚洲毛片 | 91麻豆成人精品国产免费网站 | 国产剧情av在线 | 美女福利视频一区 | 看毛片的网址 | 视频一区欧美 | 日本成人动漫在线观看 | 欧美精品一区二区视频 | 美女av免费观看 | 在线观看一二三区 | 伊人久久超碰 | 伊人狼人久久 | 国产免费一区二区三区三州老师 | 精品国产大片大片大片 | 中文字幕有码视频 | 成人黄色免费网址 | 99福利影院 | 午夜激情男女 | 免费黄色网址观看 | 午夜在线免费观看视频 | 欧美日韩一区在线播放 | 日韩一区二区三区视频 | 调教91| 福利小视频 | 日韩免费黄色片 | 丰满大乳国产精品 | 94av| 99re免费视频 | 麻豆av一区二区 | 日本中文字幕在线播放 | 天天玩夜夜操 | 五月天福利视频 | 亚洲xxx视频 | 国产三级观看 | 欧美日韩国产电影 | 成人国产一区二区三区 | 久久婷五月天 | 久久一区二区三区精品 | 一区二区少妇 | 超碰精品在线观看 | 日本丰满熟妇hd | 亚洲女人被黑人巨大进入 | 少妇人妻在线视频 | 欧美日韩国产专区 | 牛牛在线视频 | 亚洲小说网 | 一区二区精品视频在线观看 | 欧美三极片 | 91.xxx.高清在线 | 伊人成人在线 | 成人午夜淫片100集 伊人久久国产 | 日韩激情久久 | 超碰成人在线观看 | 国产福利免费观看 | 福利网址在线观看 | 波多野结衣a v在线 欧洲免费av | 亚洲乱码一区 | 欧美不卡网| 欧美中文字幕一区二区三区 | 美腿丝袜一区二区三区 | 国产91视频在线 | www久久久天天com | 欧美日韩视频一区二区三区 | 操少妇视频| 国产色无码精品视频国产 | 黄网在线观看视频 | 中文字幕在线资源 | 久久久com|