P1137 旅行计划

Posted pangbi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1137 旅行计划相关的知识,希望对你有一定的参考价值。

题意:给出一个图,图中有n个城市m条有向边;

    让我们求出以某一城市为终点的情况下,能够走的城市的数量尽量多

      求出以每一个城市为终点的时候的答案

思路:dp+拓扑排序。

    首先题意没有说明图是无环图,假如此题有环的话,是无法解的(个人见解,对错还待考证)

      于是,我们可以运用拓扑排序的性质,先将入度为0的纳入队列进行更新;

        为什么是入度为0呢,因为只有在这种情况下,得出的才是一个确定值,假如还有入度的话,就无法确定

          所以一步一步更新,在更新某个点时,就将这个点所连接的其他点的入度--,等到入度为0时就纳入队列

            这个时候这个点的答案就已经确定,所以可以作为其他点的一个转移点

技术图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=2e5+10;
 4 struct node
 5 {
 6     int v,nxt;
 7 }G[maxn];
 8 queue<int>q;
 9 int head[maxn];int num;
10 void add(int u,int v)
11 {
12     G[++num].v=v;G[num].nxt=head[u];head[u]=num;
13 }
14 int vis[maxn];
15 int dp[maxn];
16 int main()
17 {
18     int n,m;
19     scanf("%d%d",&n,&m);
20     for(int i=1;i<=m;i++){
21         int u,v;
22         scanf("%d%d",&u,&v);
23         add(u,v);
24         vis[v]++;
25     }
26     for(int i=1;i<=n;i++){
27         if(!vis[i]){
28             q.push(i);
29             dp[i]=1;
30         }
31     }
32     while(!q.empty()){
33         int u=q.front();
34         q.pop();
35         for(int i=head[u];i;i=G[i].nxt){
36             int v=G[i].v;
37             dp[v]=max(dp[v],dp[u]+1);
38             vis[v]--;
39             if(!vis[v]) q.push(v);
40         }
41     }
42     for(int i=1;i<=n;i++) printf("%d
",dp[i]);
43     return 0;
44 }
View Code

 

以上是关于P1137 旅行计划的主要内容,如果未能解决你的问题,请参考以下文章

P1137 旅行计划

洛谷P1137 旅行计划

P1137 旅行计划

luogu P1137 旅行计划 题解

洛谷P1137 旅行计划 拓扑排序 图论

P1137 旅行计划