拓扑排序 JOJ 2237: Hero Ranklist

 


StatusIn/OutTIME LimitMEMORY LimitSubmit TimesSolved UsersJUDGE TYPE
stdin/stdout5s8192K228103Standard

Arthur想要将手下的战士按照能力进行排名, 选择出得力的助手进行冒险. 他收集了很多人之间比武的胜负情况,如A战胜了B,B战胜了C等。他发现,这些胜负关系之间彼此互不矛盾,也就是不能出现C又战胜了A这种情况,但很多人之间并没有比武, 也就无法衡量谁更强。在这种情况下,Arthur想把所有可能的排行榜都列举出来,供他进一步研究。

Input:

本题目包括多个Case。每个Case的第一行有2个数字m,n. m<13,代表有多少个人物,每个人物使用一个大写字母表示。之后有n行, n<100, 每一行有2个字母X Y, 中间有一个减号, 表示X战胜过Y。可以假定输入没有重复.

Output:

对于每一个Case, 输出所有可能的排行榜序列, 每个序列占据一行, 各个序列之间按照字母升序排列. 每个Case后面有一个空行

Sample Input:

3 2
A-B
A-C
4 3
A-B
C-A
C-D

Sample Output:

ABC
ACB

CABD
CADB
CDAB

 

Problem Source: skywind

 


This problem is used for contest: 32 

 

 

 

#include<iostream>
int pre[20][20],num[20];
bool flag[20];
char s[20];
int m,n;
void dfs(int step)
{
 int i,j;
 if(step>=m)
 {
  s[step]=0;
  printf("%s/n",s);
  return;
 }
 bool k=true;
 for(i=0;i<m;i++)
 {
  if(!flag[i])
  {
   k=true;
   for(j=0;j<num[i];j++)  //来验证他的前面端点是不是全都被便利
   if(!flag[pre[i][j]])
   {
    k=false;
    break;
   }
   if(k)  //若前面的端点全都已被便利,则拿来这个点
   {
    s[step]=i+'A';
    flag[i]=true;
    dfs(step+1);
    flag[i]=false;
      }
  }
 }
}
 
int main()
{
 freopen("in.txt","r",stdin);
 freopen("out.txt","w",stdout);
 while(scanf("%d%d",&m,&n)!=EOF)
 {
  memset(flag,false,sizeof(flag));
  memset(num,0,sizeof(num));
  for(int i=0;i<n;i++)
  { 
   scanf("%s",s);
   pre[s[2]-'A'][num[s[2]-'A']]=s[0]-'A';
   num[s[2]-'A']++;
  }
  dfs(0);
  printf("/n");
 }   
 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值