ZCMU-2153-ly的排队问题

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


 

要求:字典序最小 => 使用:优先队列+小根堆

(进不去提交页面,所以也不知道对不对,反正这题最重要的是上面这句话um...)

(且鉴于本人较懒,就把 char 改为 int 了)


 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=5e+3;
 4 int cnt,t;
 5 int vis[maxn],in[maxn],ans[maxn];
 6 vector<int>v[maxn];
 7 priority_queue< int,vector<int>,greater<int> >q;
 8 
 9 int main()
10 {
11     int a,b;
12     char x;
13     memset(vis,0,sizeof(vis));
14     memset(in,0,sizeof(in));
15     while(cin>>a>>x>>b)
16     {
17         if(vis[a]==0)
18         {
19             vis[a]=1;
20             cnt++;
21         }
22         if(vis[b]==0)
23         {
24             vis[b]=1;
25             cnt++;
26         }
27         if(x=='>')
28         {
29             v[a].push_back(b);
30             in[b]++;
31         }
32         else
33         {
34             v[b].push_back(a);
35             in[a]++;
36         }
37     }
38     for(int i=0; i<500; i++)
39         if(vis[i]==1 && in[i]==0)
40             q.push(i);
41     while(!q.empty())
42     {
43         int now=q.top();
44         q.pop();
45         ans[t++]=now;
46         for(unsigned int i=0; i<v[now].size(); i++)
47         {
48             vis[v[now][i]]--;
49             if(vis[v[now][i]]==0) q.push(v[now][i]);
50         }
51     }
52     if(t!=cnt)
53         cout<<"No Answer!"<<endl;
54     else
55     {
56         for(int i=0; i<t; i++)
57             cout<<ans[i];
58         cout<<endl;
59     }
60     return 0;
61 }

 

posted @ 2022-05-18 16:08  爱吃虾滑  阅读(28)  评论(0)    收藏  举报