今天学习topsort,明天强联通分量。topsort是一种在DAG(有向无环图)中来制定顺序的方法,从入度为0开始一个一个编排顺序直至所有的边都有了顺序(或者形成了环)最后如果图中还剩下元素那一定是个环,所以topsort还可以用来判环。今天打了到topsort的例题如下。
这道题的意思就是说按一定顺序来做题入度一样的题可以一起做,看需要多长的时间,a所有的题都只要1min所以要初始化入度为0的题都需要1min,下面给出代码(打了两遍 ,都错在同一个地方我也真是orz了)。这个地方十分的神奇,好吧其实不神奇自己不认真,这个题的题目开始是从0开始的但我的tail加是从一开始最后便利的时候i从0到<n导致一直wa了一个点真不细心啊。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<ctime> #include<cmath> #include<algorithm> #include<iomanip> #include<vector> #include<queue> #include<stack> #include<map> using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } struct bwy { int v,id; }q[500]; int n,m; int ans=0; int a[500][500],b[5090],now[500],t=0;; int main() { //freopen("1.in","r",stdin); n=read();m=read(); for(int i=1;i<=m;i++) { int x,y,z; x=read();y=read();z=read(); a[x][y]=z; b[y]++; } for(int i=0;i<n;i++) { if(b[i]==0) { q[++t].id=i; q[t].v=1; } } for(int j=1;j<=t;j++) { for(int i=0;i<n;i++) { if(a[q[j].id][i]!=0) { b[i]--; now[i]=max(now[i],a[q[j].id][i]+q[j].v); if(b[i]==0) { q[++t].id=i; q[t].v=now[i]; } } } } for(int i=1;i<=t;i++) { ans=max(ans,q[i].v); } printf("%d\n",ans); return 0; }
完事。
谁翻乐府凄凉曲,风也萧萧,雨也萧萧,瘦尽灯花又一宵。