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;
} 
原文地址:https://www.cnblogs.com/FoxC/p/13579975.html