【C - 班长竞选】
题意:
大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学。
思路:
从图中找出所有强连通分量进行缩点,那么首先某一个强连通分量中的人获得了该强连通分量中节点数目减一得票数。他们还会获得其他与之相连的强连通分量的票数。
计算出每个节点对应的连通分量:利用dfs计算出图的后序序列,根据逆后序序列遍历反向图,构建强连通分量,根据构建出的强连通分量进行缩点得到缩点后的图,并记录下缩点后对应的内部节点个数,遍历每一个节点,通过dfs利用连通分量计算得到的投票数,找出最大投票数,并找出对应的的节点。
代码:
#include<stdio.h>
#include<cstring>
using namespace std;
const int N = 5010;
const int M = 30010;
int head1[N], head2[N], head[N], ind[N], c[N], dfn[N], vis[N], scc[N], judge[N], belong[N];
int inx, num, dcnt, scnt, tot1, tot2, tot;
struct Edge {int to, next;
}e1[M], e2[M], e[M];
void add1(int x, int y)//原图
{e1[++tot1].next = head1[x];e1[tot1].to = y;head1[x] = tot1;
}
void add2(int x, int y)//反图
{e2[++tot2].next = head2[x];e2[tot2].to = y; head2[x] = tot2;
}
void add(int x, int y)//缩点图
{e[++tot].next = head[x];e[tot].to = y;head[x] = tot;ind[y]++;
}
void dfs1(int x)
{vis[x] = 1;for (int i = head1[x]; i != 0; i = e1[i].next){int v = e1[i].to;if (!vis[v])dfs1(v);}dfn[++dcnt] = x;
}
void dfs2(int x)
{c[x] = scnt;scc[scnt]++;//记录当前缩点里点的个数for (int i = head2[x]; i != 0; i = e2[i].next){int v = e2[i].to;if (!c[v])dfs2(v);}
}
void dfs(int x)
{num += scc[x];vis[x] = 1;for (int i = head[x]; i != 0; i = e[i].next){int v = e[i].to;if (!vis[v])dfs(v);}
}
void kosaraju(int n)
{dcnt = 0, scnt = 0;memset(c, 0, sizeof(c));//0-n-1有效 存储缩点号memset(dfn, 0, sizeof(dfn));memset(vis, 0, sizeof(vis));for (int i = 0; i < n; i++)if (!vis[i])dfs1(i);for (int i = n; i >= 1; i--)//按逆后序缩点if (!c[dfn[i]]){++scnt;dfs2(dfn[i]);}
}
void spt(int n)//构造缩点图
{for (int x = 0; x < n; x++){for (int i = head2[x]; i != 0; i = e2[i].next){int v = e2[i].to;if (c[x] == c[v])continue;add(c[x], c[v]);}}
}
void solve(int n)
{kosaraju(n);spt(n);int maxn = 0;//maxn:最高票数memset(belong, 0, sizeof(belong));for (int i = 1; i <= scnt; i++)//缩点{if (ind[i] == 0){memset(vis, 0, sizeof(vis));num = 0;dfs(i);belong[i] = num - 1;//除了自己if (num - 1 > maxn)maxn = num - 1;}}printf("Case %d: %d\n", inx, maxn);inx++;memset(judge, 0, sizeof(judge));for (int i = 1; i <= scnt; i++)if (belong[i] == maxn)judge[i] = 1;int ix = 0;for (int i = 0; i < n; i++){if (judge[c[i]]){if (ix)printf(" %d", i);elseprintf("%d", i);ix++;}}printf("\n");
}
void ini()
{memset(head1, 0, sizeof(head1));//0也有效memset(head2, 0, sizeof(head2));memset(head, 0, sizeof(head));memset(ind, 0, sizeof(ind));memset(scc, 0, sizeof(scc));tot = 0, tot1 = 0, tot2 = 0;
}
int main()
{int t;scanf("%d", &t);inx = 1;while (t--){ini();int n, m;scanf("%d %d", &n, &m);for (int i = 0; i < m; i++){int a, b;scanf("%d %d", &a, &b);add1(a, b);add2(b, a);}solve(n);}
}
【C - 班长竞选】相关推荐
- 扁平活力学生工作班长竞选PPT模板
模板介绍 精美PPT模板设计,扁平活力学生工作班长竞选PPT模板.一套学生会竞选幻灯片模板,内含灰色多种配色,精美风格设计,动态播放效果,精美实用. 一份设计精美的PPT模板,可以让你在汇报演讲时脱颖 ...
- java班长竞选投票_竞选班长采取投票式,引家长不满,班主任:您说该怎么选?...
竞选班长采取投票式,引家长不满,班主任:您说该怎么选? 重庆市某小学二(7)班,上周班队会上进行了班长的选举,学生通过投票的方式来选出正.副两名班长. 二(2)班共有60名学生,其中蒋文浩同学得票数最 ...
- 程序设计思维 C - 班长竞选 (强连通分量、kosaraju算法)
题目 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了 ...
- Week8 作业 C - 班长竞选 SCC Kosaraju HDU - 3639
题目描述 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收 ...
- 程序设计思维与实践 Week8 作业 C - 班长竞选
题目描述 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收 ...
- 【Week8作业 C】班长竞选【SCC缩点】
题意: 大学班级选班长,n个同学均可以发表意见.若意见为A B,则表示A认为B合适.意见具有传递性,即A认为B合适,B认为C合适,则A也认为C合适.共m条意见,要求出最高票数和候选人名单. 思路: 有 ...
- 程序设计——第八周(差分约束:选数问题;拓扑排序:求比赛名次;scc:选班长)
A.差分选数 题目描述 给定一个数轴上的 n 个区间,要求在数轴上选取最少的点使得第 i 个区间 [ai, bi] 里至少有 ci 个点 使用差分约束系统的解法解决这道题 使用差分约束系统的解法解决这 ...
- SDU程序设计思维实践题目总结
题目来源及链接 题目名称及讲解博客链接 涉及算法 原题以及原题链接 第二周作业 Maze BFS POJ-3984 Pour water BFS POJ-1606 第二周实验 化学 模拟 codefo ...
- 数据分区与放置策略解析_数据策略好数据与坏数据
数据分区与放置策略解析 In 1990 the Virginia based bank "Signet Bank" decided to trust two smart peopl ...
最新文章
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第五步--button控制主角Jumpamp;Crouch
- C#, ASP.NET面试题系列(1)
- 声学漫谈之五:音腔是怎么影响声音效果的
- 【数据库】数据库常见操作指令
- Halcon - 测量 - 轮廓到线的距离
- webservice xsd.exe根据xml生成xsd。然后根据xsd生成java bean
- 前端学习(2459):账户设置
- 嵌入式linux启动根文件系统,嵌入式Linux根文件系统制作和挂载
- if语句写阶跃函数C语言,C语言第四章分支语句.ppt
- C# Task 用法
- api工具 graphql_使用GraphQL构建更好的可发现的API
- 如何在python中检查文件大小?
- log4j.xml示例_log4j.xml示例配置
- c字符串分割成数组_数组与字符串
- 阿里云线上案例分析:网格应用存活状态异常
- 好公司和差公司的对比
- 跟着杨中科学习asp.net之dom
- 贾俊平统计学思维导图- 第六章 统计量及其抽样分布
- Kerberos鉴权后Spark程序连接Redis数据库,解决No Reachable node in cluster错误
- PHP字符串函数strtoupper( 将字符串转化为大写)