• 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;
    } 
    
  • 相关阅读:
    orale 函数大全[转] 涛
    easyuicombobox的option选项为true与false时的问题 涛
    数据库镜像转移Failover Partner 涛
    创建链接服务器 涛
    Sql Server 2008 R2 清空数据库中ldf日志文件 涛
    杂 涛
    Jquery 数组操作大全【转载】 涛
    VS2012常用快捷键 涛
    android studio集成ijkplayer Vevi
    CenOs 部署记录 Vevi
  • 原文地址:https://www.cnblogs.com/FoxC/p/13579975.html
Copyright © 2020-2023  润新知