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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【Week8作业 C】班长竞选【SCC缩点】

發布時間:2024/3/26 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Week8作业 C】班长竞选【SCC缩点】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:

大學班級選班長,n個同學均可以發表意見。若意見為A B,則表示A認為B合適。意見具有傳遞性,即A認為B合適,B認為C合適,則A也認為C合適。共m條意見,要求出最高票數和候選人名單。


思路:

有向圖,有強聯通分量SCC,應先求出所有SCC并縮點。求SCC用kosaraju算法,第一遍dfs1確定原圖的逆后序序列,第二遍dfs2在反圖中按照逆后序序列進行遍歷,每次由起點遍歷到的點即構成一個SCC。
縮點:求完SCC后,此時有scnt個SCC,且c[i]為頂點i所在的SCC編號。結構point里有一個vector,用來存放該SCC里的所有頂點。point P[scnt]就存儲了所有SCC的頂點。用vector G3來存放scc圖,且邊為反向(之后有用)。注意對邊(u,v)添加(c[u],c[v])時,要保證c[u]!=c[v],即兩個點不在同一個SCC里。同時要注意兩個scc頂點間可能會有多條邊,要通過vector的unique函數來去重。
縮點后不難發現對于屬于第i個SCC的點來說,答案分為兩部分,當前SCC中的點除去自己和其他SCC中的點,即ans=SCC[i]-1+sum(SCC[j]),其中j可到達i。稍加思考,可以發現最后答案一定出現在出度為0的SCC中。所以將G3圖中的邊反向,對每個入度為0的點進行dfs3,計算其能到達的點SUM(SCC[j]),即可得到答案。


總結:

一道綜合性很強的題,要求SCC,再縮點,然后dfs,最后答案輸出還要略加注意。還應注意這n個同學的編號為0~n-1。


代碼:

#include <iostream> #include <vector> #include <algorithm> using namespace std; //注意n個同學編號為0~n-1 int n,m,a,b; vector<int> G1[5010],G2[5010]; //原圖與反圖 int c[5010],dfn[5010],vis[5010],dcnt,scnt; //c[i] i號點所在SCC編號;dfn[i] dfs后序列中第i個點 //dcnt dfs序計數;scnt scc計數 void dfs1(int x) {vis[x]=1;for(int i=0; i<G1[x].size(); i++)if(!vis[G1[x][i]])dfs1(G1[x][i]);dfn[dcnt]=x;dcnt++; } void dfs2(int x) {c[x]=scnt;for(int i=0; i<G2[x].size(); i++)if(!c[G2[x][i]])dfs2(G2[x][i]); } void kosaraju() //求SCC {dcnt=0,scnt=0;for(int i=0; i<5010; i++)c[i]=0,vis[i]=0;for(int i=0; i<n; i++)if(!vis[i])dfs1(i);for(int i=n-1; i>=0; i--)if(!c[dfn[i]])++scnt,dfs2(dfn[i]); } //scc頂點編號從1開始 struct point //scc縮點 {vector<int> allV; }; point P[5010]; //用于存放scc的點 vector<int> G3[5010]; //存放scc間的關系,且邊為反向 int indeg[5010]; //入度 int dfs3(int v) //計算入度為0的點的sum(scc[j]) {vis[v]=1;int ans=P[v].allV.size();for(int i=0;i<G3[v].size();i++)if(!vis[G3[v][i]])ans=ans+dfs3(G3[v][i]);return ans; } int main() {ios::sync_with_stdio(false);int T;cin>>T;for(int sjzs=1;sjzs<=T;sjzs++){cin>>n>>m;//圖初始化for(int i=0; i<n; i++)G1[i].clear(),G2[i].clear();//讀入圖 for(int i=0; i<m; i++){cin>>a>>b;G1[a].push_back(b);G2[b].push_back(a);}//求SCCkosaraju();//縮點int sum[scnt+1];for(int i=1;i<=scnt;i++) G3[i].clear(),indeg[i]=0,sum[i]=0,P[i].allV.clear(); for(int i=0;i<n;i++){P[c[i]].allV.push_back(i);for(int j=0;j<G1[i].size();j++){if(c[i]!=c[G1[i][j]]) //兩點不在同一個scc {G3[c[G1[i][j]]].push_back(c[i]);indeg[c[i]]++;}}}//G3圖應去重 for(int i=1;i<=scnt;i++){sort(G3[i].begin(),G3[i].end());G3[i].erase(unique(G3[i].begin(),G3[i].end()),G3[i].end());}for(int i=1;i<=scnt;i++){if(indeg[i]==0){//清空visfor(int j=1;j<=scnt;j++) vis[j]=0;sum[i]=dfs3(i)-1; //自己的點數要-1 }}//輸出int maxpiao=0;for(int i=1;i<=scnt;i++)if(maxpiao<sum[i]) maxpiao=sum[i];int ans[5010],index=0;for(int i=1;i<=scnt;i++){if(sum[i]==maxpiao) //將scci加入到答案序列ans中 {for(int j=0;j<P[i].allV.size();j++){ans[index]=P[i].allV[j];index++;}}}sort(ans,ans+index); cout<<"Case "<<sjzs<<": "<<maxpiao<<endl;for(int i=0;i<index-1;i++)cout<<ans[i]<<" ";cout<<ans[index-1]<<endl;}}

總結

以上是生活随笔為你收集整理的【Week8作业 C】班长竞选【SCC缩点】的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 妞干网这里只有精品 | 久久国产精品-国产精品 | 久久综合一区二区 | 肉视频在线观看 | 亚洲第一大综合区 | 三级毛毛片 | 五月天激情婷婷 | 日本三级大片 | 天天天操操操 | 狠狠干2018 | 波多野结衣 在线 | 一级片黄色的 | 亚洲精品五月 | 免费特级黄色片 | 在线免费观看不卡av | 午夜一区二区视频 | 日本a级片免费 | 亚洲免费在线视频观看 | 久久久久看片 | 性欧美8khd高清极品 | 美日韩黄色片 | 少妇高潮喷水在线观看 | 国产成人麻豆精品午夜在线 | 亚洲制服av | 日美av| 国产精视频 | 国产精品久久久久久影视 | 东北老女人av| jizz视频| 久久成人人人人精品欧 | cekc老妇女cea0| 国产人妖av| 日日艹 | 日本高清在线播放 | 毛片一区二区三区 | 亚洲一级影片 | 国产精品中文字幕在线 | 99久久综合 | 国内激情视频 | 777精品久无码人妻蜜桃 | 激情欧美一区二区免费视频 | 免费观看成人鲁鲁鲁鲁鲁视频 | 国产伦精品一区二区三区视频孕妇 | 99久久精品免费 | 中文字幕在线三区 | 亚洲卡一 | 涩涩网站视频 | 国产亚洲色婷婷久久 | 亚洲av无码不卡一区二区三区 | 国产做爰视频免费播放 | 中文字幕色站 | 一区精品在线 | 91视频污在线观看 | 91成人精品 | 91黄免费 | 巨乳美女被爆操 | 91caob | 日日夜夜精| 中文字幕激情 | 九月丁香婷婷 | 超碰蜜臀 | 亚州激情视频 | 日本久久久网站 | 一区二区在线观看av | 天天看黄色片 | 国外av在线 | 日韩美av| 色鬼综合 | 一女双乳被两男吸视频 | 中国人妖和人妖做爰 | 久久人人草 | 在线播放视频高清在线观看 | 日韩精品在线网站 | 国产美女无遮挡永久免费 | 亚洲人妖在线 | 婷婷色网| 91麻豆精品一区二区三区 | 第九色 | 午夜在线精品偷拍 | 精品国产91 | 欧美日韩在线高清 | 欧美日韩电影一区二区三区 | 蜜臀av免费在线观看 | 九一国产在线观看 | 亚洲欧美中文字幕 | 免费的av在线 | 日韩在线色 | 免费在线观看你懂的 | 肉色超薄丝袜脚交一区二区 | 国产午夜在线播放 | 粉色午夜视频 | 99热免费在线观看 | 天天干天天插天天操 | 操碰97| 九热在线| 亚洲高清免费观看 | 日日夜夜免费视频 | 久久久久久国产精品无码 | 玩弄人妻少妇500系列视频 |