zoukankan      html  css  js  c++  java
  • P2607 [ZJOI2008]骑士

    P2607 [ZJOI2008]骑士

    题目描述
    Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英。他们劫富济贫,惩恶扬善,受到社会各界的赞扬。

    最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争。战火绵延五百里,在和平环境中安逸了数百年的Z国又怎能抵挡的住Y国的军队。于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶。

    骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾。每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不会与自己最厌恶的人一同出征的。

    战火绵延,人民生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!国王交给了你一个艰巨的任务,从所有的骑士中选出一个骑士军团,使得军团内没有矛盾的两人(不存在一个骑士与他最痛恨的人一同被选入骑士军团的情况),并且,使得这支骑士军团最具有战斗力。

    为了描述战斗力,我们将骑士按照1至N编号,给每名骑士一个战斗力的估计,一个军团的战斗力为所有骑士的战斗力总和。


    给昨天补代码

    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    const int maxn=1001000;
    struct node
    {
    	int u,v;
    	int nxt;
    }; 
    node line[maxn<<1];
    int head[maxn],tail=-1;
    long long value[maxn];
    bool vis[maxn];
    void add(int a,int b)
    {
    	line[++tail].u=a;
    	line[tail].v=b;
    	line[tail].nxt=head[a];
    	head[a]=tail;
    }
    int Res;
    void circle(int now,int f)
    {
    	vis[now]=true;
    	for(int i=head[now];i!=-1;i=line[i].nxt)
    	{
    		if(line[i].v==f)	continue;
    		if(!vis[line[i].v])
    			circle(line[i].v,now);
    		else
    			Res=i;
    	}
    }
    long long f[maxn][2];
    void Dfs(int now,int fa,int ban)
    {
    	f[now][0]=0;
    	f[now][1]=(now==ban ? 0 :value[now]);
    	for(int i=head[now];i!=-1;i=line[i].nxt)
    	{
    		if(line[i].v==fa||i==Res||i==(Res^1))	continue;
    		Dfs(line[i].v,now,ban);
    		f[now][0]+=max(f[line[i].v][0],f[line[i].v][1]);
    		f[now][1]+=f[line[i].v][0];	
    	}
    	return ;
    }
    int main() 
    {
    	int n,data;
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)	
    		head[i]=-1;
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d%d",&value[i],&data);
    		add(data,i);
    		add(i,data);
    	}
    	long long ans=0;
    	for(int i=1;i<=n;i++)
    	{
    		if(vis[i])	continue;
    		circle(i,0);
    		int c=Res;
    		Dfs(line[c].u,0,line[c].v);
    		long long pas=max(f[line[c].u][0],f[line[c].u][1]);
    		Dfs(line[c].v,0,line[c].u);
    		pas=max(max(f[line[c].v][0],f[line[c].v][1]),pas);
    		ans+=pas;
    	}
    	printf("%lld",ans);
    }
    
  • 相关阅读:
    关于vim和emacs两个编辑器的想法
    人工智能简史 --- 笔记
    快速软件开发-书摘
    golang v 1.13 使用goproxy
    设计原本- the design of design 笔记
    access和trunk端口和hybird端口的区别
    子网划分及子网掩码计算方法
    ARM9裸板学习--win10下TQ2440裸板烧录(需要串口线和网线)
    嵌入式Linux学习2--Ubuntu18.04中C、C++环境的搭建
    嵌入式Linux学习1--Ubuntu18.04.3安装
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/9335464.html
Copyright © 2011-2022 走看看