P7228 [COCI2015-2016#3] MOLEKULE

[COCI2015-2016#3] MOLEKULE

首先,这个题给出的是一棵树,也就是没有环,但题目没有提及。

首先如果是一棵树的话,这个“最长通路”一定是 11,我们考虑这么一种方式:

首先,我们钦定 11 为根节点,对于当前的层数,如果是奇数的话,必定是父亲连向儿子,偶数层则是儿子连向父亲,就可以保证“最长通路”为 11

证明也很简单,如果对于偶数层的点,他无法连向任何点,“最长通路”为 00

如果是奇数的话,他仅仅可以连向他的父亲结点和儿子结点,而父亲和儿子都是偶数结点,没有最长通路,所以最长是 11

在实现的时候,我们考虑先连接双向边,然后是如果是父亲连向儿子,父亲对儿子这条边就赋值为 11 ,儿子对父亲就赋值为 1-1,表示儿子和父亲之间没有连边。

儿子连向父亲也是一样的。

最后看两个边之间的值是 00 还是 11,按照题意输出即可。

#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
struct node
{
	int v,w;
};
int dep[N],u[N],v[N];
vector<node>g[N<<1];
void dfs(int u,int fath)
{
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i].v;
		if(v==fath)
			continue;
		dep[v]=dep[u]+1;
		dfs(v,u);
	}
}
void Slove(int u,int fath)
{
	if(dep[u]%2==0)
	{
		for(int i=0;i<g[u].size();i++)
		{
			int v=g[u][i].v;
			if(v==fath)
				continue;
			g[u][i].w=0;
			for(int j=0;j<g[v].size();j++)
				if(g[v][j].v==u)
				{
					g[v][j].w=1;
					break;
				}
		}
	}
	else
	{
		for(int i=0;i<g[u].size();i++)
		{
			int v=g[u][i].v;
			if(v==fath)
				continue;
			g[u][i].w=1;
			for(int j=0;j<g[v].size();j++)
				if(g[v][j].v==u)
				{
					g[v][j].w=0;
					break;
				}
		}
	}
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i].v;
		if(v==fath)
			continue;
		Slove(v,u);
	}
}
int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	std::ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int n;
	cin>>n;
	dep[1]=1;
	for(int i=1;i<n;i++)
		cin>>u[i]>>v[i],g[u[i]].push_back({v[i],-1}),g[v[i]].push_back({u[i],-1});
	dfs(1,0);
	Slove(1,0);
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<g[u[i]].size();j++)
		{
			int v1=g[u[i]][j].v,w=g[u[i]][j].w;
			if(v1==v[i])
			{
				if(w==0)
					cout<<"0"<<endl;
				else
					cout<<"1"<<endl;
				break;
			}
		}
	}
	return 0;
}
posted @   June_Failure  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示