洛谷 P5145 漂浮的鸭子(拓扑排序||最大环)

题目链接: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 }
AC代码

 

posted @ 2020-08-29 21:39  dfydn  阅读(152)  评论(0编辑  收藏  举报