zcmu-2153(拓扑排序+优先队列)

2153: D.ly的排队问题

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 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");
	}
} 

猜你喜欢

转载自blog.csdn.net/yu121380/article/details/80743162