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 }