hpuoj 1706: 牛B【正向拓扑】【建图】
1706: 牛B
时间限制: 1 Sec 内存限制: 128 MB
提交: 22 解决:
6
[提交][状态][讨论版]
题目描述
一群来自日本恐怖分子带着AK47,火箭弹,开着坦克,带着飞机,强行洗劫了一家位于日本的银行,但是众所周知日本人比较奸诈,比较野蛮,但是恐怖分子更加残忍,他们烧杀抢掠无情的蹂躏着日本人,并且最终成功将这家银行的钱全部抢走。但是由于日本人比较贪婪这些恐怖分子总想一个人独占抢来的所有钱。当然这引起了其他人的不满为此他们为了独占所有的钱进行自相残杀。已知这群恐怖分子有N个人(N<=200)并且知道M(M<=1000)种关系每行两个人说明前面的人能杀死后面的人现在请你判断是否存在独一无二的一种顺序如果存在输出这个排名由最牛B的到最弱B依次输出这群日本人的名字如果不存在或数据有冲突(有冲突即日本人A杀死日本人B后日本人B又复活将日本人A杀死(日本人太残暴了)等等)输出”baga”.
输入
输入第一行两个整数N和M,N代表有N(2=<N<=200)个日本恐怖分子,M组关系(1=<M<1000)接下来每行两个字符串分别代表日本人的名字第一个日本人能杀死第二个日本人。输入数据保证N个人的名字都出现过并且人名的字符不超过20个。
输出
样例输入
4 3
anbeijinsan gangcunningci
gangcunningci songjingshigen
songjingshigen dongtiaoyingji
4 3
anbeijinsan xiaoquanyilang
gancunningc shanben56
anbeijinsan shanben56
2 2
anbeijinsan gangcunningci
gangcunningci anbeijinsan
样例输出
anbeijinsan gangcunningci songjingshigen dongtiaoyingji
baga
baga
此题不难重在建图:
注意:1、所要输出的序列必须是独一无二的,即除了最牛B的人其余的人必定能被另一个人杀死,且是一级一级按顺序的比如(共有四个人ABCD 则顺序为 A杀死B,B杀死C,C杀死D)
那么如何判断是否独一无二呢? 很简单,就是在入队列时,每一次队列中都必定只有一个元素
2、不能成环,这个就容易了,只需判断最后排序完成之后判断参与排序的人数是否等于总人数即可
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int n,m;
char a[50],b[50];
char str[210][50];
int map[210][210],vis[210];
int s[210][210];
int d[210];
void qing()
{
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
memset(s,0,sizeof(s));
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
memset(str,'\0',sizeof(str));
}
void getmap()
{
int q,p,i,j,sum=1;
qing();
for(i=1;i<=m;i++)
{
q=p=-1;
scanf("%s%s",a,b);
for(j=1;j<sum;j++)
{
if(strcmp(str[j],a)==0)
{
q=j;
map[i][1]=j;
}
if(strcmp(str[j],b)==0)
{
p=j;
map[i][2]=j;
}
if(q!=-1&&p!=-1)
break;
} if(q==-1)
{
q=sum++;
map[i][1]=q;
strcpy(str[q],a);
} if(p==-1)
{
p=sum++;
map[i][2]=p;
strcpy(str[p],b);
} }
for(i=1;i<=n;i++)
{
if(!s[map[i][1]][map[i][2]])
{
s[map[i][1]][map[i][2]]=1;
vis[map[i][2]]++;
}
}
}
void tuopu()
{
int i,j,ok=0;
int ant=0;
queue<int>q;
while(!q.empty())
q.pop();
for(i=1;i<=n;i++)
if(vis[i]==0)
q.push(i);
int u,ans=0;
while(!q.empty())
{
if(q.size()>1)//判断是否独一无二
{
ok=1;
break;
}
u=q.front();
q.pop();
d[ans++]=u;
for(i=1;i<=n;i++)
{
if(s[u][i])
{
vis[i]--;
if(!vis[i])
q.push(i);
}
}
}
if(ans!=n)//判断是否成环
ok=1;
if(ok)
printf("baga\n");
else
{ for(i=0;i<ans-1;i++)
printf("%s ",str[d[i]]);
printf("%s\n",str[d[ans-1]]);
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
getmap();
tuopu();
}
return 0;
}
hpuoj 1706: 牛B【正向拓扑】【建图】的更多相关文章
- 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)
题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...
- POJ3687——Labeling Balls(反向建图+拓扑排序)
Labeling Balls DescriptionWindy has N balls of distinct weights from 1 unit to N units. Now he tries ...
- HDU 4857 逃生 【拓扑排序+反向建图+优先队列】
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)
逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会 ...
- poj 3683 2-sat建图+拓扑排序输出结果
发现建图的方法各有不同,前面一题连边和这一题连边建图的点就不同,感觉这题的建图方案更好. 题意:给出每个婚礼的2个主持时间,每个婚礼的可能能会冲突,输出方案. 思路:n个婚礼,2*n个点,每组点是对称 ...
- Paint the Grid Again (隐藏建图+优先队列+拓扑排序)
Leo has a grid with N × N cells. He wants to paint each cell with a specific color (either black or ...
- 【建图+拓扑判环】BZOJ3953: [WF2013]Self-Assembly
Description 自动化学制造(Automatic Chemical Manufacturing,简称ACM)正在对一个叫自组装(self-assembly)的过程进行实验.在这个过程中,有着天 ...
- [十二省联考2019]字符串问题——后缀自动机+parent树优化建图+拓扑序DP+倍增
题目链接: [十二省联考2019]字符串问题 首先考虑最暴力的做法就是对于每个$B$串存一下它是哪些$A$串的前缀,然后按每组支配关系连边,做一遍拓扑序DP即可. 但即使忽略判断前缀的时间,光是连边的 ...
- bzoj5017 炸弹 (线段树优化建图+tarjan+拓扑序dp)
直接建图边数太多,用线段树优化一下 然后缩点,记下来每个点里有多少个炸弹 然后按拓扑序反向dp一下就行了 #include<bits/stdc++.h> #define pa pair&l ...
随机推荐
- ios动力特效,最重要的一点 属性保持(写了动力特效但是没效果的原因就在这里)
@property (nonatomic, strong) UIDynamicItemBehavior *square1PropertiesBehavior; @property (nonatomic ...
- [转]jQuery源码分析系列
文章转自:jQuery源码分析系列-Aaron 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAaro ...
- Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)解决方法
登陆mysql的时候,出现了这个问题: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' ( ...
- struts2 Action 接收参数的三种方法
刚学Struts2 时 大家可能遇到过很多问题,这里我讲一下Action 接收参数的三种方法,我曾经在这上面摔过一回.所以要警醒一下自己..... 第一种:Action里声明属性,样例:account ...
- CI源码引用使用--php引用demo,静态变量和引用关系
CI源码引用使用在Common.php中,加载配置和类的方法 function &test() { static $a = ''; if (!$a) { $a ...
- 谈memcache和memcached的区别
用了段时间的memcache和memcached总结下认识,看很多人在用cache的时候,刚刚都没有搞清楚memcache 和 memcached的区别,还有就是使用的时候基本都是 get/set ...
- php生成二维码
<?php $urlToEncode="163.com"; generateQRfromGoogle($urlToEncode); function generate ...
- QML之TextEdit
TextEdit显示一个可编辑的,有格式的文本框.它也可以显示明文和富文本.例如:TextEdit { width: 240 text: "<b>Hello</ ...
- js 中文排序
/** * 比较函数 * @param {Object} param1 要比较的参数1 * @param {Object} param2 要比较的参数2 * @return {Number} 如果pa ...
- 【微机】验证负数以补码存储程序 C语言
微机中验证负数以补码存储程序 一.相关基础知识 负数的补码等于它的反码加1,即在其反码的最低位加1就为该数的补码,且在计算机中负数以补码形式进行存储. .int型占4字节(32位二进制)char型占1 ...