您的位置:首页 > 其它

巡回赛 -- 简单的拓扑排序

2016-04-07 19:38 246 查看




这是我最爱的 红色 . NICE

题意 : 第一行 测试案例的组数 第二行每一组案例的 拳手个数 和 比赛的场数    如果不能确定唯一的排名 就输出 No Answer 下面附上渣渣代码

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<string>
#include<sstream>
#include<map>
#include<cctype>
using namespace std;
int a[30][30],n,m,visited[30],result[30];
void topsort()   //  有唯一的  序列
{
int mark=0,flag,fuck=1;
for(int i=1;i<=n;i++)   //  从第一名开始找
{
mark=0;
for(int j=0;j<n;j++)   //  从这些人中 开始找
{
if(visited[j]==0)   //  没有爸爸
{
flag=j;   //   这个 没有 爸爸
mark++;
}
}
if(mark!=1)  //  1 : mark=0  就是  都有爸爸 , 成环了 2 :  有两个没爸爸的  ,   搞基了
{
fuck=0;
printf("No Answer");
break;
}
result[i]=flag;         //  第一名存起来
visited[flag]--;            //  第一名欠一个爸爸  (  这个人已经被用了  )
for(int k=0;k<n;k++)
{
if(a[k][flag])     //  以刚才没有爸爸的人 做爸爸的 ( 也就是 没有爷爷 )  , 现在爸爸死了 , 儿子们的亲爸爸 -1
{
visited[k]--;
}
}
}
if(fuck)
for(int i=1;i<=n;i++)
printf("%c",result[i]+'A');
printf("\n");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(visited,0,sizeof(visited));
memset(a,0,sizeof(a));
for(int i=0;i<m;i++)
{
char b,c;
scanf(" %c %c",&b,&c);
if(a[c-'A'][b-'A']==0)    //  直接 防止 有重边      //由于 从  高到底输出
{
a[c-'A'][b-'A']=1;   //   c   有一个  叫做   b 的 爸爸
visited[c-'A']++;    //  c 的爸爸数 ++
}
}
topsort();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: