优先队列 stl 拓扑排序
2153: D.ly的排队问题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 169 Solved: 73
[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
https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=2153
#include<bits/stdc++.h>//网上大佬的代码 using namespace std; typedef long long LL; const int inf=1e9; const int maxn=1e6+5; vector<int>edge[50]; int in[50]; int main() { char s[5]; set<int>k;//储存人的个数,set避免重复; while(cin>>s) { k.insert(s[2]-'A'); k.insert(s[0]-'A'); if(s[1]=='>') { in[s[2]-'A']++; edge[s[0]-'A'].push_back(s[2]-'A'); } else { in[s[0]-'A']++; edge[s[2]-'A'].push_back(s[0]-'A'); } } priority_queue<int,vector<int>,greater<int> >q;//greater<int>表示左边大于右边,vector<int>为储存的方式; //less<int>表示右边大于左边; //greater表示内置类型从大到小排序,less表示内置类型从小到大排序。 //左进右出,greater表示最小值优先,less表示最大值优先; for(int i=0;i<30;i++) { if(in[i]==0&&k.count(i)!=0)//set集合count()函数运用,count()返回集合中某个值元素的个数 ; q.push(i);//优先队列,保证是按字典序排列; } vector<int>ans; while(!q.empty()) { int p=q.top(); q.pop();//top就是取队首元素,pop就是队首元素出队; ans.push_back(p);//记录每一个点 for(int i=0;i<edge[p].size();i++) { int y=edge[p][i]; in[y]--; if(in[y]==0&&k.count(y)!=0) q.push(y); } } if(ans.size()==k.size()) { for(int i=0;i<ans.size();i++) printf("%c",ans[i]+'A'); printf("\n"); } else printf("No Answer!\n"); return 0; }
#include<cstdio> #include<cstring> #include<queue> #include<set> #include<vector> #include<functional>//greater,less; using namespace std; const int maxn=100+3; char str[4]; int in[maxn]; set<int>ss; vector<int>ans; vector<int>edge[maxn]; priority_queue<int,vector<int>,greater<int> >q; int main() { while(scanf("%s",str)!=EOF){ ss.insert(str[0]-'A'); ss.insert(str[2]-'A'); if(str[1]=='>'){ edge[str[0]-'A'].push_back(str[2]-'A'); in[str[2]-'A']++; }else{ edge[str[2]-'A'].push_back(str[0]-'A'); in[str[0]-'A']++; } } for(int i=0;i<100;i++){ if(in[i]==0&&ss.count(i)!=0){ q.push(i); } } while(!q.empty()){ int u=q.top(); q.pop(); ans.push_back(u); for(int i=0;i<edge[u].size();i++){ int v=edge[u][i]; in[v]--; if(in[v]==0){ q.push(v); } } } //printf("%d\n",ans.size()); //printf("%d\n",ss.size()); if(ans.size()==ss.size()){ for(int i=0;i<ss.size();i++){ printf("%c",ans[i]+'A'); } printf("\n"); }else{ printf("No Answer!\n"); } return 0; }