P7228 [COCI2015-2016#3] MOLEKULE
[COCI2015-2016#3] MOLEKULE
首先,这个题给出的是一棵树,也就是没有环,但题目没有提及。
首先如果是一棵树的话,这个“最长通路”一定是 ,我们考虑这么一种方式:
首先,我们钦定 为根节点,对于当前的层数,如果是奇数的话,必定是父亲连向儿子,偶数层则是儿子连向父亲,就可以保证“最长通路”为 。
证明也很简单,如果对于偶数层的点,他无法连向任何点,“最长通路”为 。
如果是奇数的话,他仅仅可以连向他的父亲结点和儿子结点,而父亲和儿子都是偶数结点,没有最长通路,所以最长是 。
在实现的时候,我们考虑先连接双向边,然后是如果是父亲连向儿子,父亲对儿子这条边就赋值为 ,儿子对父亲就赋值为 ,表示儿子和父亲之间没有连边。
儿子连向父亲也是一样的。
最后看两个边之间的值是 还是 ,按照题意输出即可。
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现