题意:

大学班级选班长,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缩点】相关推荐

  1. Week8 作业 C - 班长竞选 SCC Kosaraju HDU - 3639

    题目描述 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收 ...

  2. 程序设计思维与实践 Week8 作业 C - 班长竞选

    题目描述 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收 ...

  3. BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]

    2707: [SDOI2012]走迷宫 题意:求s走到t期望步数,\(n \le 10^4\),保证\(|SCC| \le 100\) 求scc缩点,每个scc高斯消元,scc之间直接DP 注意每次清 ...

  4. 洛谷P2341 [HAOI2006]受欢迎的牛 (Tarjan,SCC缩点)

    P2341 [HAOI2006]受欢迎的牛|[模板]强连通分量 https://www.luogu.org/problem/P2341 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就 ...

  5. P2746 P2812 [USACO5.3]校园网Network of Schools[SCC缩点]

    题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作"接受学校").注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学 ...

  6. 扁平活力学生工作班长竞选PPT模板

    模板介绍 精美PPT模板设计,扁平活力学生工作班长竞选PPT模板.一套学生会竞选幻灯片模板,内含灰色多种配色,精美风格设计,动态播放效果,精美实用. 一份设计精美的PPT模板,可以让你在汇报演讲时脱颖 ...

  7. 程序设计思维 C - 班长竞选 (强连通分量、kosaraju算法)

    题目 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了 ...

  8. 【C - 班长竞选】

    题意: 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集 ...

  9. 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur (SCC缩点,SPFA最长路,枚举反边)

    P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of hi ...

最新文章

  1. kaggle账号_机器学习竞赛入门--kaggle篇
  2. .Net Telerik Web UI 安装和使用入门
  3. Android Studio中有没有类似于Eclipse中的ctrl+2+L的快捷键? \Android Studio快捷键之代码提示...
  4. 世界视频编码器大赛结果出炉,腾讯香农编码器跻身世界一流
  5. html渐变效果做网页,CSS实现文本渐变效果
  6. 【Blog.Core开源】网关统一集成下游服务文档
  7. TQ210——S5PV210 uboot顶层mkconfig分析
  8. 二元函数泰勒公式例题_高等数学期末总复习 DAY 5. 罗尔定理证明题 拉格朗日、柯西中值定理 泰勒公式及麦克劳林公式...
  9. 深度解读最流行的优化算法:梯度下降
  10. Python DearPyGui 基础
  11. 面向对象(OOP)基本概念及基本语法
  12. java520.1314表白_520最新表白公式,拿去不谢!
  13. 计算机操作系统笔记(五)
  14. macOS 11 Big Sur 开启 2K 分辨率的 HiDPI 模式(五分钟完成)
  15. 软件设计师中级-数据库系统
  16. 听课记录高中计算机,高中听课记录
  17. Android:layout_weight详解
  18. 天正菜单栏不见了怎么显示出来_天正CAD中菜单栏不见了如何调出来?
  19. 捡到的苹果手机怎么解id锁_苹果手机维修中软解与硬解的区别
  20. 使用微搭低代码制作每日菜单小程序

热门文章

  1. 驱动程序开发:基于EC20 4G模块自动拨号联网的两种方式(GobiNet工具拨号和PPP工具拨号)
  2. FOP XSL中文自动换行
  3. 常用邮箱POP3和SMTP服务器 设置
  4. 网页设计(前端)学习笔记
  5. (14)ROS学习-ROS工作空间覆盖
  6. 环境监测设备中ESD测试步骤
  7. 2021考研数学 高数第五章 定积分与反常积分
  8. 2015华为提前批招聘经历
  9. 洛谷_P3371 【模板】单源最短路径(弱化版)_dijkstra_堆优化
  10. 服务器调微信小程序推送接口,微信小程序API 转发消息