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个。
输出
输出如果存在一组独一无二从牛B到弱B的排名输出这个排名中日本人的名字由牛B到弱B依次输出如果不存在或有冲突输出”baga”;
样例输入
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; }
时间: 2024-10-06 00:56:04