题解 洛谷P1960 【郁闷的记者】

\[\huge\texttt{Description} \]

日期 \(\texttt{2020}\)\(\texttt{10}\)\(\texttt{5}\)
编号 \(\texttt{P1960}\)
算法 模拟拓扑排序
来源 \(\texttt{NOI导刊}\)

\[\huge\texttt{Solution} \]

这是一道比较简单的题目,我们可以使用以下简单的模拟
本人并没有学过拓扑排序,模拟赛做完这道题目,别人告诉我,这就是拓扑排序
因此,大家我的思路理解成是拓扑排序也可以。
首先我们把这些数据转化成一个图。
\(A\)能打败\(B\),我们就连一条有向边从\(A\)\(B\)
我们每次找到一个没有入度的点,说明他是目前排名最高的,并把它剔除。
如果某一次有很多点都没有入度,说明排名不唯一。
其实就做完了。

\[\huge\texttt{Code} \]

#include<bits/stdc++.h>
using namespace std;
int TotalPoint,TotalEdge;
set< int >Edge[5001];
set< int >Die[5001];
bool Used[5001];
int main(void)
{
	register int i,j;
	cin>>TotalPoint>>TotalEdge;
	for(i=1;i<=TotalEdge;i++)
	{
		register int U,V;
		cin>>U>>V;
		Edge[U].insert(V);
		Die[V].insert(U);
	}
	register bool Flag;
	Flag=false;
	for(i=1;i<=TotalPoint;i++)
	{
		register int Count;
		Count=0;
		register int W;
		for(j=1;j<=TotalPoint;j++)
		{
			if(Used[j])
			{
				continue;
			}
			if(!Die[j].size())
			{
				Count++;
				if(Count==1)
				{
					W=j;
				} 
			}
		}
		Used[W]=true;
		cout<<W<<endl;
		for(set<int>::iterator k=Edge[W].begin();k!=Edge[W].end();k++)
		{
			Die[*k].erase(W);
		}
		if(Count>1)
		{
			Flag=true;
		}
	}
	cout<<Flag<<endl;
	return 0;
}

posted @ 2020-10-06 10:41  Bushuai_Tang  阅读(193)  评论(0编辑  收藏  举报