uva 11748 Rigging Elections
2016-03-30 20:39
337 查看
题意:有n个竞选人,由m个人投票,每个人对竞选人都有一个排名,每次两个人竞选,m个人分别投票,每次两个人,胜利者继续参与竞选,失败者淘汰,剩余一个人的时候停止你希望让c最后获得胜利
,你可以安排每次参与竞选的两个竞选人,问是否有可能让c竞选成功
分析:胜利者向失败者连一条有向边,那么问题就转化为从c出发,是否能顺边访问所有的点,一次dfs遍历就行了
简图的时候,不是按照输入记录,记录竞选人在投票人心目中的排名,这样最后便于建图
View Code
,你可以安排每次参与竞选的两个竞选人,问是否有可能让c竞选成功
分析:胜利者向失败者连一条有向边,那么问题就转化为从c出发,是否能顺边访问所有的点,一次dfs遍历就行了
简图的时候,不是按照输入记录,记录竞选人在投票人心目中的排名,这样最后便于建图
#include<iostream> #include<Cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int maxn=105; int d[maxn][maxn],n,m,c,x,vis[maxn]; vector<int> G[maxn]; void dfs(int u){ vis[u]=1; for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(!vis[v]) dfs(v); } } int main(){ while(~scanf("%d%d%d",&n,&m,&c)&&n+m+c){ for(int i=1;i<=m;i++) for(int j=1;j<=n;j++){ scanf("%d",&x); d[i][x]=j; } for(int i=1;i<=n;i++)G[i].clear(); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++){ int cnt=0; for(int k=1;k<=m;k++) if(d[k][i]<d[k][j]) cnt++; if(cnt>m/2) G[i].push_back(j); else G[j].push_back(i); } memset(vis,0,sizeof(vis)); dfs(c); int cnt=0; for(int i=1;i<=n;i++) if(vis[i]) cnt++; if(cnt==n) puts("yes"); else puts("no"); } return 0; }
View Code
相关文章推荐
- nyoj 176 整数划分(二)【dp】
- Storm简介
- C语言实现文件复制
- Linux IO操作——RIO包
- DTO – 服务实现中的核心数据
- Python 读取输入 input 和raw_input
- 数据结构与算法分析
- 深入理解计算机系统
- ubuntu 14.04系统 Android 4.0.1 源码编译过程
- Shell 参数(2) --解析命令行参数工具:getopts/getopt
- Accelerated C++:通过示例进行编程实践——习题解答(第0章 入门)
- 第四周项目1-求两个数的最大公约数
- servlet页面跳转多次传参
- 【系统运维】--linux服务器上传测试代码注意事项
- 使用list和tuple
- C程序设计语言
- GNS3中7200路由器的模块名问题
- 人脸特征点检测
- 遮罩层的实现
- Oracle学习(九)----表的增删改查,回收站