zoukankan      html  css  js  c++  java
  • P4410 [HNOI2009]无归岛 仙人掌图

    P4410 [HNOI2009]无归岛 仙人掌图

    题意

    分析:

    我们通过分析发现,原来的图是一个环,环上每一个点可能连着一个三元环的仙人掌图

    由于整体也是一个环所以不用区分环内和环外,直接搜到环之后做DP求最大带权独立集就行了

    代码:

    #include<bits/stdc++.h>
    
    using namespace std;
    
    namespace zzc
    {
    	const int maxn = 1e5+5;
    	int n,m,cnt=0,idx;
    	int f[maxn][2],head[maxn],dfn[maxn],fa[maxn];
    	
    	struct edge
    	{
    		int to,nxt;
    	}e[maxn<<2];
    	
    	void add(int u,int v)
    	{
    		e[++cnt].to=v;
    		e[cnt].nxt=head[u];
    		head[u]=cnt;
    	}
    	
    	void dp(int rt,int x)
    	{
    		int s,t,tmp;
    		s=f[x][0],t=0;
    		for(int i=fa[x];i!=rt;i=fa[i])
    		{
    			tmp=max(s,t);
    			t=f[i][1]+s;
    			s=f[i][0]+tmp;
    		}
    		f[rt][1]+=s;
    		s=t=0;
    		for(int i=x;i!=rt;i=fa[i])
    		{
    			tmp=max(s,t);
    			t=f[i][1]+s;
    			s=f[i][0]+tmp;
    		}
    		f[rt][0]+=max(s,t);
    	}
    	
    	void dfs(int u)
    	{
    		dfn[u]=++idx;
    		for(int i=head[u];i;i=e[i].nxt)
    		{
    			int v=e[i].to;
    			if(!dfn[v]&&v!=fa[u])
    			{
    				fa[v]=u;
    				dfs(v);
    			}
    		}
    		for(int i=head[u];i;i=e[i].nxt)
    		{
    			int v=e[i].to;
    			if(fa[v]!=u&&dfn[v]>dfn[u]) dp(u,v);
    		}
    	}
    	
    	void work()
    	{
    		int a,b;
    		ios::sync_with_stdio(false);
    		cin>>n>>m;
    		for(int i=1;i<=m;i++)
    		{
    			cin>>a>>b;
    			add(a,b);add(b,a);
    		}
    		for(int i=1;i<=n;i++) cin>>f[i][1];
    		dfs(1);
    		printf("%d
    ",max(f[1][0],f[1][1]));
    	}
    
    }
    
    int main()
    {
    	zzc::work();
    	return 0;
    }
    
    
  • 相关阅读:
    再谈PHP、Python与Ruby
    php消息队列
    创业如同追女生:成功的创业者都是追女生好手
    Windows 下 Python easy_install 的安装
    常用Python第三方库 简介
    Highcharts使用手册
    sqoop java api
    redis 读写分离
    linux 安装redis
    hive 安装和部署
  • 原文地址:https://www.cnblogs.com/youth518/p/13904617.html
Copyright © 2011-2022 走看看