【luogu1137】旅行计划 [拓扑排序]

博客围绕图论学习展开,介绍了最长路DAG拓扑排序过程中直接进行DP的方法。实现时会维护队列和结点入度,删除边时减去相应结点入度,入度为0则加入队列,还表达了对图论的惯性恐惧。

P1137 旅行计划

最长路 DAG 拓扑排序的过程中直接 DP

算是从头开始图论的学习....emmmmmmm

通常情况下,在实现的时候会维护一个队列以及每个结点的入度。在删 除边的时候顺便把相应结点的入度减去,当这个结点入度为 0 的时候直接 将其加入队列。

大概对图论形成了惯性思维 看到就怕QAQ

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<stack>
 7 #include<algorithm>
 8 using namespace std;
 9 #define ll long long
10 #define rg register
11 const int N=100000+5,M=200000+5,inf=0x3f3f3f3f,P=19650827;
12 int n,m,r[N],f[N];
13 template <class t>void rd(t &x)
14 {
15     x=0;int w=0;char ch=0;
16     while(!isdigit(ch)) w|=ch=='-',ch=getchar();
17     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
18     x=w?-x:x;
19 }
20 
21 int head[N],tot=0;
22 struct edge{int v,nxt;}e[M];
23 void add(int u,int v){
24     e[++tot]=(edge){v,head[u]};head[u]=tot;
25 }
26 
27 queue<int> q;
28 void topsort(){
29     for(rg int i=1;i<=n;++i)
30     if(!r[i]) q.push(i),f[i]=1;
31     while(!q.empty()){
32         int u=q.front();q.pop();
33         for(rg int i=head[u];i;i=e[i].nxt){
34             int v=e[i].v;
35             --r[v];
36             if(!r[v]) q.push(v),f[v]=f[u]+1;
37         }
38     }
39 }
40 
41 int main(){
42     memset(r,0,sizeof(r));
43     rd(n),rd(m);
44     for(rg int i=1;i<=m;++i){
45         int u,v;
46         rd(u),rd(v);
47         add(u,v),++r[v];
48     }
49     topsort();
50     for(rg int i=1;i<=n;++i) printf("%d\n",f[i]);
51     return 0;
52 }
53  

 

转载于:https://www.cnblogs.com/lxyyyy/p/10923484.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值