P5145 漂浮的鸭子
题目描述
下雨时地上会有一个个水坑,但一个水坑只会流向另一个特定的水坑,而且水不会回流。可能会有多个水坑同时流向一个水坑。这天又下起了雨夹鸭,每个水坑里都漂浮着一只鸭子。WYH在每个水坑旁派遣了一个特派员,特派员会在鸭子上做记号。在某一时刻,全部鸭子开始顺水漂浮,同时特派员开始计时。当某个特派员发现他做的那个记号的鸭子漂浮回来的时候,他就会停止计时,把时间上报给WYH。现在WYH探勘了地形后把每段水流的关系与时间告诉了你,他想知道他所获得的所有数据中最大的那个是?
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 10e5 + 10;
struct E{
int to,v,nxt;
}e[N * 2];
int head[N],tot,n,d[N],t[N];
int vis[N];
int dis[N],ans,in[N],cnt;
int fa[N];
int find(int x){return fa[x] = (fa[x] == x ? x : find(fa[x]));}
void merge(int x, int y){
int f1 = find(x);
int f2 = find(y);
fa[f1] = f2;
}
void add(int u,int v,int w){
e[++tot].to = v;
e[tot].v = w;
e[tot].nxt = head[u];
head[u] = tot;
merge(u,v);
}
int dfs(int x){
vis[x]++;
if(vis[x] == 2) return dfs(e[x].to) + e[x].v;
else if(vis[x] > 2){
in[++cnt] = x;
return 0;
}
return dfs(e[x].to);
}
int main(){
scanf("%d",&n);
for(int i = 1; i <= n; i++)
fa[i] = i;
for(int i = 1; i <= n; i++){
scanf("%d%d",&d[i],&t[i]);
add(i,d[i],t[i]);
}
for(int i = 1; i <= n; i++){
int a = 0;
a = find(i);
}
for(int i = 1; i <= n; i++){
int f = 1;
for(int j = 1 ; j <= cnt; j++)
if(find(i) == find(in[j])) f = 0;
if(!vis[i] && f)
ans = max(dfs(i),ans);
}
cout << ans << endl;
return 0;
}