标签: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 }
标签:while head node main 答案 队列 clu cli eve
原文地址:https://www.cnblogs.com/pangbi/p/12577091.html