HDU-3639-Hawk-and-Chicken(强连通,缩点,DFS)
链接:https://vjudge.net/problem/HDU-3639
题意:
有n个小朋友在一个班级中,现在要选择班长。收集了小朋友们的意见,一条意见表示为A认为B合适。这个是具备传递性的,A认为B合适,B认为C合适。那么A也会认为C合适。
现在需要提供一份候选人名单,这里面的人,是被最多的人,认为合适的。
思路:
tarjan,缩点,再根据缩点之后的点建立反向的新图,用来求每个人的的票数。
不过在找得票数的时候用记忆化搜索wa了,不知道为啥
代码:
- #include <iostream>
- #include <memory.h>
- #include <string>
- #include <istream>
- #include <sstream>
- #include <vector>
- #include <stack>
- #include <algorithm>
- #include <map>
- #include <queue>
- #include <math.h>
- #include <cstdio>
- #include <set>
- #include <iterator>
- #include <cstring>
- using namespace std;
- typedef long long LL;
- const int MAXN = 5e3+10;
- const int INF = 0x3f3f3f3f;
- vector<int> G[MAXN];
- vector<int> Gr[MAXN];
- stack<int> St;
- int Dfn[MAXN], Low[MAXN];
- int Vis[MAXN], Dis[MAXN];
- int Fa[MAXN], Fans[MAXN];
- int Num[MAXN];
- int n, m;
- int times, cnt;
- void Init()
- {
- for (int i = 1;i <= n;i++)
- G[i].clear(), Fa[i] = i, Gr[i].clear();
- memset(Dfn, 0, sizeof(Dfn));
- memset(Low, 0, sizeof(Low));
- memset(Vis, 0, sizeof(Vis));
- memset(Dis, 0, sizeof(Dis));
- memset(Num, 0, sizeof(Num));
- memset(Fans, -1, sizeof(Fans));
- times = cnt = 0;
- }
- void Tarjan(int x)
- {
- Dfn[x] = Low[x] = ++times;
- Vis[x] = 1;
- St.push(x);
- for (int i = 0;i < G[x].size();i++)
- {
- int node = G[x][i];
- if (Dfn[node] == 0)
- {
- Tarjan(node);
- Low[x] = min(Low[x], Low[node]);
- }
- else if (Vis[node] == 1)
- Low[x] = min(Low[x], Dfn[node]);
- }
- if (Low[x] == Dfn[x])
- {
- cnt++;
- Num[cnt] = 0;
- while (St.top() != x)
- {
- Num[cnt]++;
- Fa[St.top()] = cnt;
- Vis[St.top()] = 0;
- St.pop();
- }
- Num[cnt]++;
- Fa[St.top()] = cnt;
- Vis[St.top()] = 0;
- St.pop();
- }
- }
- int GetFans(int x)
- {
- Vis[x] = 1;
- int sum = 0;
- for (int i = 0;i < Gr[x].size();i++)
- {
- int node = Gr[x][i];
- if (Vis[node] == 1)
- continue;
- sum += Num[node] + GetFans(node);
- }
- return sum;
- }
- int main()
- {
- int t, cn = 0;
- cin >> t;
- while (t--)
- {
- cin >> n >> m;
- Init();
- // cin >> Cost[i];
- int l, r;
- for (int i = 1;i <= m;i++)
- {
- scanf("%d%d", &l, &r);
- l++, r++;
- // cin >> l >> r;
- G[l].push_back(r);
- }
- for (int i = 1;i <= n;++i)
- if (!Dfn[i])
- Tarjan(i);
- for (int i = 1;i <= n;i++)
- {
- for (int j = 0;j < G[i].size();j++)
- {
- int node = G[i][j];
- int l = Fa[i], r = Fa[node];
- if (l != r)
- {
- ++Dis[l];
- Gr[r].push_back(l);
- }
- }
- }
- int number = -1, is = 0;
- for (int i = 1;i <= cnt;i++)
- {
- if (Dis[i] == 0)
- {
- memset(Vis, 0, sizeof(Vis));
- Fans[i] = Num[i]-1 + GetFans(i);
- number = max(number, Fans[i]);
- }
- }
- cout << "Case " << ++cn << ": " << number << endl;
- for (int i = 1;i <= n;i++)
- {
- if (Fans[Fa[i]] == number)
- {
- if (is++ == 0)
- cout << i-1;
- else
- cout << ' ' << i-1 ;
- }
- }
- cout << endl;
- }
- return 0;
- }
HDU-3639-Hawk-and-Chicken(强连通,缩点,DFS)的更多相关文章
- 【HDU 5934】Bomb(强连通缩点)
Problem Description There are N bombs needing exploding. Each bomb has three attributes: exploding r ...
- HDU 3639 Hawk-and-Chicken (强连通缩点+DFS)
<题目链接> 题目大意: 有一群孩子正在玩老鹰抓小鸡,由于想当老鹰的人不少,孩子们通过投票的方式产生,但是投票有这么一条规则:投票具有传递性,A支持B,B支持C,那么C获得2票(A.B共两 ...
- HDU 5934:Bomb(强连通缩点)
http://acm.hdu.edu.cn/showproblem.php?pid=5934 题意:有N个炸弹,每个炸弹有一个坐标,一个爆炸范围和一个爆炸花费,如果一个炸弹的爆炸范围内有另外的炸弹,那 ...
- Codeforces 1027D Mouse Hunt (强连通缩点 || DFS+并查集)
<题目链接> 题目大意: 有n个房间,每个房间都会有一只老鼠.处于第i个房间的老鼠可以逃窜到第ai个房间中.现在要清理掉所有的老鼠,而在第i个房间中防止老鼠夹的花费是ci,问你消灭掉所有老 ...
- HDU 3639 Hawk-and-Chicken(强连通分量+缩点)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013480600/article/details/32140501 HDU 3639 Hawk-a ...
- hdu 4635 Strongly connected 强连通缩点
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个n个点m条边的图,问在图不是强连通图的情况下,最多可以向图中添多少条边,若图为原来 ...
- hdu 2767 Proving Equivalences 强连通缩点
给出n个命题,m个推导,问最少添加多少条推导,能够使全部命题都能等价(两两都能互推) 既给出有向图,最少加多少边,使得原图变成强连通. 首先强连通缩点,对于新图,每一个点都至少要有一条出去的边和一条进 ...
- HDU 3639 Hawk-and-Chicken(良好的沟通)
HDU 3639 Hawk-and-Chicken 题目链接 题意:就是在一个有向图上,满足传递关系,比方a->b, b->c,那么c能够得到2的支持,问得到支持最大的是谁,而且输出这些人 ...
- HDU 1827 Summer Holiday(强连通)
HDU 1827 Summer Holiday 题目链接 题意:中文题 思路:强连通缩点,每一个点的权值为强连通中最小值,然后入度为0的点就是答案 代码: #include <cstdio> ...
- poj2553 强连通缩点
The Bottom of a Graph Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 10114 Accepted: ...
随机推荐
- 深入理解JVM - 垃圾收集器与内存分配策略 - 第三章
引用计数算法——判断对象是否存活的算法 很多教科书判断对象是否存活的算法是这样的:给对象添加一个引用计数器,每当一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象 ...
- python基础-元组
操作元组 获取元组中的值 tup1 = ('高数','计算机',2008,2016) tup2 = (1,2,3,4,5,6,7) #和list的一样,同样取下标1,2,3,4的值 print(&qu ...
- vs中解决方案、项目、类及ATL的理解
解决方案,是对所有要完成工作的统称,一般叫Solution. 项目,也叫工程,是将解决方案分成若干个模块进行处理,一般叫做Project.添加项目就是添加工程.解决方案是所有项目的总和. 一个项目里面 ...
- OpenCV——PS滤镜之 波浪效果 wave
// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...
- 「NOIP2017」「LuoguP3959」 宝藏(爆搜
题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nn 个深埋在地下的宝藏屋, 也给出了这 nn 个宝藏屋之间可供开发的mm 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏. ...
- poj2356Find a multiple——鸽巢定理运用
题目:http://poj.org/problem?id=2356 N个数,利用鸽巢定理可知应有N+1个前缀和(包括0),因此其%N的余数一定有重复: 同余的两个前缀和之差一定为N的倍数,据此得出答案 ...
- nagios监控windows配置
1.下载并安装windows插件 http://sourceforge.net/projects/nscplus/NSCP-0.4.1.73-x64.msi2.windows端配置 nsclient. ...
- SQL 排序规则 CodeProject
http://www.cnblogs.com/ifreesoft/p/4259626.html 开发ERP数据维护工具之一 修改SQL Server数据库排序规则 Change Collation ...
- [MTC3]Cracking SHA1-Hashed Passwords
题目地址:https://www.mysterytwisterc3.org/en/challenges/level-ii/cracking-sha1-hashed-passwords 解题关键:根据键 ...
- 连接Oracle数据库的Hibernate配置…
连接Oracle数据库的Hibernate配置文件 连接Oracle的Hibernate配置文件有两种格式,一种是xml格式的,另一种是Java属性文件格式的.下面分别给出这两种格式配置文件的代码. ...