2237: Hero Ranklist
Result | TIME Limit | MEMORY Limit | Run Times | AC Times | JUDGE |
---|---|---|---|---|---|
5s | 8192K | 248 | 111 | Standard |
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
#include<iostream>
#include<algorithm>
using namespace std;
int m,n;
int map[20][20],in[20],vis[20],res[20];
void dfs(int step)
{
if(step==m)
{
for(int i=0;i<m;i++) printf("%c",res[i]+'A');printf("/n");
return ;
}
for(int i=0;i<m;i++)
{
if(in[i]==0&&vis[i]==0)
{
vis[i]=1;
for(int j=0;j<m;j++)
{
if(map[i][j]>0)
{
map[i][j]=-map[i][j];
in[j]--;
}
}
res[step]=i;
dfs(step+1);
vis[i]=0;
for(int j=0;j<m;j++)
{
if(map[i][j]<0)
{
map[i][j]=-map[i][j];
in[j]++;
}
}
}
}
}
int main()
{
while(scanf("%d%d",&m,&n)==2)
{
memset(vis,0,sizeof(vis));
memset(in,0,sizeof(in));
memset(map,0,sizeof(map));
for(int p=0;p<n;p++)
{
string str;
cin>>str;
map[str[0]-'A'][str[2]-'A']=1;
in[str[2]-'A']++;
}
// for(int i=0;i<m;i++){ for(int j=0;j<m;j++) cout<<map[i][j];cout<<endl;}
//for(int i=0;i<m;i++) cout<<in[i]<<"...";cout<<endl;
dfs(0);
printf("/n");
}
return 0;
}