タイトル説明
全国ツアーに行く暁明。国が#NNの都市があり、NNに11番、およびMMを結ぶ道路があり、暁明準備は都市のひとつから出発し、私だけが停止東街を行くことに。
彼はライン上のラインの前で最初の都市、都市のすべての都市の東に加えて、この前提を満たすためには、また訪問したいのでこと、到着する最初の都市を選択するように、と私は終わりである都市へのルートを開発する必要がありますので、できるだけ都市。
さて、あなただけのすべての道路が接続されている2つの都市間の相対的な位置関係を知っているが、すべての都市の特定の場所を知りません。これで、すべてのiについて、あなたはボブと訪問する都市の最大数の終わりで得られた都市IIのコースを開発する必要があります。
入力形式
図11は、2つの正の整数N、MN、M.あります
2つの正の整数の次MM線が確実にするために、都市YY XX都市道路との接続が存在するY-X、Y、ショー、xはその都市の都市のXX YY西。
出力フォーマット
NNラインは、II最初の行は、ツアーができる都市の最大番号の末尾の最初II都市で発現正の整数を含んでいます。
サンプル入力と出力
入力#1
5 6
1 2
1 3
2 3
2 4
3 4
2 5
出力#1
1
2
3
4
3
分析と説明:
この質問は、トポロジカル整列。各点は、それが全ての回答ということである先行ノード、すなわち、回答プラス1 F [I] = MAX(F [I]、F [J] + +1) ;で隣接リスト図形、格納されたトポロジカルソート(カウントビットテンプレート)少ししながらDPを十分に。
コード:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue> //STL队列
using namespace std;
int n,m,dis[100010],in[100010],tot,f[100010];
queue<int>q; //创建队列
struct node{
int to,next;
}a[400010];
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
ios::sync_with_stdio(false);
cin>>x>>y;
a[++tot].to=y; //邻接表
a[tot].next=dis[x];
dis[x]=tot;
in[y]++;
}
for(int i=1;i<=n;i++)
if(!in[i])
{ //拓扑排序部分
f[i]=1;
q.push(i);
}
while(!q.empty())
{
int cnt=q.front();q.pop();
memset(in,0,sizeof(in));
for(int i=dis[cnt];i;i=a[i].next)
{
f[a[i].to]=max(f[a[i].to],f[cnt]+1); //前驱节点+1
if(!--in[a[i].to])
q.push(a[i].to);
}
}
for(int i=1;i<n;i++)
cout<<f[i]<<endl; //特别注意输出
cout<<f[n];
}