• 洛谷 P1453 城市环路(基环树,树形dp)


    传送门


    解题思路

    先找到基环树上的环,然后断掉任意一条环上的边,分别以两个端点做树形dp(没有上司的舞会),最后答案就是max(dp1[s][0],dp2[t][0])。
    其中dp1[s][0]为以s为根节点不选s的答案,dp2[t][0]表示以t为根节点不选t时的答案。
    注意断边不能只看点,因为有可能是个二元环

    AC代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<map>
    #include<vector>
    #include<iomanip>
    using namespace std;
    const int maxn=1e5+5;
    int p[maxn],cnt=1,a[maxn],in[maxn],s,t,n,del1,del2;
    double k;
    long long ans,dp[maxn][2];
    struct node{
    	int v,next;
    }e[maxn*2];
    void insert(int u,int v){
    	cnt++;
    	e[cnt].v=v;
    	e[cnt].next=p[u];
    	p[u]=cnt;
    }
    void topo(){
    	queue<int> q;
    	for(int i=1;i<=n;i++){
    		if(in[i]==1) q.push(i),in[i]--;
    	}
    	while(!q.empty()){
    		int u=q.front();q.pop();
    		for(int i=p[u];i!=-1;i=e[i].next){
    			int v=e[i].v;
    			in[v]--;
    			if(in[v]==1) q.push(v);
    		}
    	}
    }
    void dfs(int u,int fa){
    	dp[u][1]=a[u];
    	for(int i=p[u];i!=-1;i=e[i].next){
    		int v=e[i].v;
    		if(v==fa||i==del1||i==del2) continue;
    		dfs(v,u);
    		dp[u][0]+=max(dp[v][1],dp[v][0]);
    		dp[u][1]+=dp[v][0];
    	}
    }
    int main(){
    	ios::sync_with_stdio(false);
    	memset(p,-1,sizeof(p));
    	cin>>n;
    	for(int i=1;i<=n;i++) cin>>a[i];
    	for(int i=1;i<=n;i++){
    		int u,v;
    		cin>>u>>v;
    		u++;v++;
    		insert(u,v);
    		insert(v,u);
    		in[v]++;in[u]++;
    	}
    	cin>>k;
    	topo();
    	for(int u=1;u<=n;u++){
    		if(s&&t) break;
    		if(in[u]>=2){
    			for(int i=p[u];i!=-1;i=e[i].next){
    				int v=e[i].v;
    				if(in[v]==2){
    					s=u,t=v;
    					del1=i,del2=i^1;
    					break;
    				}
    			}
    		}
    	}
    	dfs(s,-1);
    	ans=dp[s][0];
    	memset(dp,0,sizeof(dp));
    	dfs(t,-1);
    	ans=max(ans,dp[t][0]);
    	cout<<fixed<<setprecision(1)<<k*ans;
    	return 0;
    }
    
  • 相关阅读:
    编译原理实验(NFA转DFA,LL1文法)
    欧几里得算法
    Codeforces Round #697 (Div. 3) A -D 解题报告
    STM32使用SPI驱动WS2812灯带
    读书笔记---<<人月神话>>5
    基于百度和echars接口,实现多点连接
    读书笔记---<<人月神话>>4
    读书笔记---<<人月神话>>3
    软件杯----------害虫地区分布展示
    web页面采用高德地图JS api和Web api实现路径规划
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/15459995.html
Copyright © 2020-2023  润新知