最长路 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 ",f[i]); 51 return 0; 52 } 53