码迷,mamicode.com
首页 > 其他好文 > 详细

P1137 旅行计划

时间:2020-03-26 21:31:11      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:while   head   node   main   答案   队列   clu   cli   eve   

题意:给出一个图,图中有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\n",dp[i]);
43     return 0;
44 }
View Code

 

P1137 旅行计划

标签:while   head   node   main   答案   队列   clu   cli   eve   

原文地址:https://www.cnblogs.com/pangbi/p/12577091.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!