算法提高 士兵排队问题
时间限制:1.0s 内存限制:256.0MB
试题
有N个士兵(1≤N≤26),编号依次为A,B,C,…,队列训练时,指挥官要把一些士兵从高到矮一次排成一行,但现在指挥官不能直接获得每个人的身高信息,只能获得“P1比P2高”这样的比较结果(P1、P2∈A,B,C,…,Z,记为 P1>P2),如”A>B”表示A比B高。
请编一程序,根据所得到的比较结果求出一种符合条件的排队方案。
(注:比较结果中没有涉及的士兵不参加排队)
请编一程序,根据所得到的比较结果求出一种符合条件的排队方案。
(注:比较结果中没有涉及的士兵不参加排队)
输入要求
比较结果从文本文件中读入(文件由键盘输入),每个比较结果在文本文件中占一行。
输出要求
若输入数据无解,打印“No Answer!”信息,否则从高到矮一次输出每一个士兵的编号,中间无分割符,并把结果写入文本文件中,文件由键盘输入:
样例输入
A>B
B>D
F>D
B>D
F>D
样例输出
AFBD
拓扑排序,注意会有重边
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
int deg[30];
int mp[30][30];
char s[30];
queue<int>q;
int main()
{
memset(deg,inf,sizeof deg);
memset(mp,-1,sizeof mp);
char a,b;
while((a=getchar())!=EOF)
{
getchar();
b=getchar();
getchar();
//printf("%c %c",a,b);
int x=a-'A';
int y=b-'A';
if(deg[x]==inf)
deg[x]=0;
if(deg[y]==inf)
deg[y]=0;
if(mp[x][y]==-1)
{
deg[y]++;
mp[x][y]=1;
}
}
for(int i=0;i<30;i++)
{
if(deg[i]==0)
{
q.push(i);
}
}
int cnt=0;
while(!q.empty())
{
int x=q.front();
q.pop();
s[cnt++]='A'+x;
for(int i=0;i<30;i++)
{
if(mp[x][i]==1)
{
deg[i]--;
if(deg[i]==0)
{
q.push(i);
}
}
}
}
s[cnt]='\0';
int i;
for(i=0;i<30;i++)
{
if(deg[i]!=0&°[i]!=inf)
{
break;
}
}
if(i==30)
printf("%s\n",s);
else
printf("No Answer!\n");
}