[P1137]羅区の旅行計画をソートトポロジカル[]

タイトル説明

全国ツアーに行く暁明。国が#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];
}
公開された35元の記事 ウォン称賛22 ビュー586

おすすめ

転載: blog.csdn.net/dgssl_xhy/article/details/104024183