2153: D.ly的排队问题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 35 Solved: 13
[ Submit][ Status][ Web Board]
Description
马上要上体育课了,上体育课之前总归是要排个队的,ly作为班长,怎么排队的问题只能由她来解决,但是马上要上课了,ly又不清楚所有人的身高,她又不好意思问每个人的身高,因为这样会显的自己很不负责,于是她只能通过肉眼观察...那么问题来了,她只能观察出两个人A和B谁高谁矮,但是她没有办法排出一个序列。
ly都已经帮你出了两次主意赢过wjw,那么现在她需要你的帮助,你可以帮她吗?
(ly会告诉你A和B谁高,如果A比B高,会用A>B来表示)
Input
只有一组数据,每个比较结果占一行,读取到文件结束
Output
若输入数据无解,则输出"No Answer!",否则从高到低输出每个人的名字,中间没有分割符
若有多种情况,输出字典序最小的答案
Sample Input
E>A
A>S
S>Y
Sample Output
EASY
解析:基础的拓扑排序+priority_queue,优先队列有一个好处就是可以直接进行我们规定的规则排序。这里有一个坑,输入以EOF结束,所以我们每次输入3个字符的时候要吃掉一个换行符,可以这样写scanf(" %c%c%c ",&a,&x,&b);在%c后面留一个空格可以吃掉回车,就是因为少吃掉一个\n wrong一发
#include<bits/stdc++.h>
using namespace std;
const int maxn=5000+10;
int vis[maxn],vv[maxn];
int ans[maxn];
vector<int> v[maxn];
int main()
{
char a,b,x;
int cnt=0,t=0;
memset(vis,0,sizeof(vis));
memset(vv,0,sizeof(vv));
//printf("%d",(int)'Z');
for(int i=0; i<maxn; i++)v[i].clear();
while(~scanf(" %c%c%c ",&a,&x,&b))
{
if(vv[a]==0)
{
vv[a]=1;
cnt++;
}
if(vv[b]==0)
{
vv[b]=1;
cnt++;
}
if(x=='>')
{
v[a].push_back(b);
vis[b]++;
}
else
{
v[b].push_back(a);
vis[a]++;
}//printf("%d %d\n",vv[a],vv[b]);
}
priority_queue<int,vector<int>,greater<int> >q;
while(!q.empty())q.pop();
for(int i=0; i<500; i++)
{
if(vv[i]==1&&vis[i]==0)
q.push(i);
}
t=0;
while(!q.empty())
{
int u=q.top();q.pop();
ans[t++]=u;
for(int i=0; i<v[u].size(); i++)
{
vis[v[u][i]]--;
if(vis[v[u][i]]==0)q.push(v[u][i]);
}
}
if(t!=cnt)
{
printf("No Answer!\n");
}
else
{
for(int i=0; i<t; i++)
printf("%c",ans[i]);
printf("\n");
}
}