题解 P7228 [COCI2015-2016#3] MOLEKULE
题解 P7228 [COCI2015-2016#3] MOLEKULE
我也来水题解了
思路分析
题目要求我们构造一种方案,确定一个
1->2<-3->4<-5
和
1<-8
^
2<-3->4<-5
v v
6 7
实现上,我们可以用一次无向图
从任意图中任一点
其中最需要注意的是虽然是无向图,但由于最后输出的是是否与给出的边反向,建立无向图时依然需要考虑区分原边和反向边。这里我们选择将反向边存在
代码
#include<iostream>
#define endl '\n'
using namespace std;
#define MAXN 100001
int n;
struct edge{
int v;
int next;
}e[MAXN<<1];
int head[MAXN];
bool towards[MAXN];//确认边要不要调换方向
bool f=0;//初始为0或1都没关系
bool vis[MAXN];
void dfs(int p)
{
if(vis[p])
return;
vis[p]=1;
f^=1;
for(int i=head[p];i;i=e[i].next)
{
if(vis[e[i].v])
continue;
//f^=1;
if(i>MAXN)
towards[i-MAXN]=f^1;
else
towards[i]=f;
dfs(e[i].v);
//f^=1;
}
f^=1;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1,j=MAXN+1,u,v;i<n;i++,j++)
{
cin>>u>>v;
e[i].v=v,e[i].next=head[u],head[u]=i;//加边
e[j].v=u,e[j].next=head[v],head[v]=j;//无向图加反向边
}
dfs(0);
for(int i=1;i<n;i++)
cout<<towards[i]<<endl;
return 0;
}
其他
回到一开始,和平行边(自环平行边大概一般都不考虑)。所以之前的思考其实是不全面的。
幸运的是,再次考虑我们刚才的思路。只需分别从每个点进行一遍