题目链接:https://www.luogu.com.cn/problem/P5145
用拓扑排序,将能在拓扑队列中的所有点删掉,即这些点不能在环中,判环。
然后找出在环中的点,进行DFS,搜一遍环看它的sum,取max
AC代码:

1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<queue> 6 using namespace std; 7 const int N=100005; 8 int head[N],in[N],c[N],vis[N]; 9 int tot,n,ans,cnt,sum; 10 queue<int> q; 11 struct node{ 12 int next,to,w; 13 }edge[N]; 14 void add(int u,int v,int w){ 15 edge[tot].next=head[u]; 16 edge[tot].to=v; 17 edge[tot].w=w; 18 head[u]=tot++; 19 } 20 void toposort(){ 21 for(int i=1;i<=n;i++) if(in[i]==0) { 22 q.push(i); 23 c[i]=0; 24 } 25 while(!q.empty()){ 26 int u=q.front(); q.pop(); 27 for(int i=head[u];i!=-1;i=edge[i].next){ 28 int v=edge[i].to; 29 in[v]--; 30 if(in[v]==0) { 31 q.push(v); 32 c[v]=0; 33 } 34 } 35 } 36 } 37 void DFS(int s){ 38 for(int i=head[s];i!=-1;i=edge[i].next){ 39 int v=edge[i].to; 40 if(vis[v]==1) { 41 ans=max(ans,sum); 42 return; 43 } 44 sum+=edge[i].w; 45 vis[v]=1; 46 DFS(v); 47 } 48 } 49 int main(){ 50 memset(head,-1,sizeof(head)); 51 memset(c,1,sizeof(c)); 52 scanf("%d",&n); 53 for(int i=1;i<=n;i++){ 54 int d,t; 55 scanf("%d%d",&d,&t); 56 add(i,d,t); 57 in[d]++; 58 } 59 toposort(); 60 for(int i=1;i<=n;i++){ 61 sum=0; 62 if(c[i]&&!vis[i]){ 63 DFS(i); 64 } 65 } 66 printf("%d",ans); 67 return 0; 68 }