题解 洛谷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;
}
不要妄图追上西坠的太阳,而是要在黎明前就等着它!