「PMOI-4」可憐的團主


一、題目

點此看題

這道題考試時候打了縮點,然后一無所獲,雖然想出了那個超級神奇的構造方法。

還是不要思維定式啊,我以為難的圖論題一定要縮點,但是我從來一打縮點就爆炸

二、解法

比較傳統的樹上二選一構造問題,根據套路任何情況一定有解

直接考慮 \(\tt dfs\) 樹,葉子之間一定無邊,如果有 \(\geq\lfloor\frac{n}{3}\rfloor\) 個葉子(不考慮根),那么我們找到解。

那么有葉子數量 \(<\lfloor\frac{n}{3}\rfloor\),考慮根是葉子也只有至多 \(\lfloor\frac{n}{3}\rfloor\) 個點,那么我們把它們兩兩匹配得到路徑至多有 \(\lceil\frac{n}{6}\rceil\) 條。

現在問題轉化成了構造一個葉子的匹配,使得樹上所有點都被覆蓋。我的方法:把所有葉子按 \(\tt dfs\) 序排序,設一共有 \(k\) 個葉子(如果 \(k\) 是奇數那么我們補上根),然后 \(i\)\(i+\frac{k}{2}\) 匹配。

已經過了,跪求上面葉子匹配構造方法的正確性證明。
UPD:有一個巨佬在我的博客下面評論了證明,我覺得他的證明是對的。

#include <cstdio>
#include <algorithm>
using namespace std;
const int M = 1005;
int read()
{
	int x=0,f=1;char c;
	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
	return x*f;
}
int n,m,k,tot,Ind,cnt,f[M],dfn[M];
int fa[M],id[M],dep[M],a[M],b[M];
struct edge
{
	int v,next;
}e[M*M];
void dfs(int u)
{
	dfn[u]=++Ind;int sz=0;
	dep[u]=dep[fa[u]]+1;
	for(int i=f[u];i;i=e[i].next)
	{
		int v=e[i].v;
		if(dfn[v]) continue;
		fa[v]=u;dfs(v);
		sz++;
	}
	if(sz==0 || (sz==1 && u==1))
		id[++k]=u;
}
int cmp(int x,int y)
{
	return dfn[x]<dfn[y];
}
void match(int u,int v)
{
	int t1=0,t2=0;cnt++;
	while(u!=v)
	{
		if(dep[u]>dep[v])
			a[++t1]=u,u=fa[u];
		else
			b[++t2]=v,v=fa[v];
	}
	a[++t1]=u;
	printf("%d ",t1+t2);
	for(int i=1;i<=t1;i++)
		printf("%d ",a[i]);
	for(int i=t2;i>=1;i--)
		printf("%d ",b[i]);
	puts("");
}
signed main()
{
	n=read();m=read();
	for(int i=1;i<=m;i++)
	{
		int u=read(),v=read();
		e[++tot]=edge{v,f[u]},f[u]=tot;
		e[++tot]=edge{u,f[v]},f[v]=tot;
	}
	dfs(1);int fl=0;
	if(id[k]==1) k--,fl=1;
	if(k>=n/3)
	{
		puts("2");
		for(int i=1;i<=n/3;i++)
			printf("%d ",id[i]);
		puts("");
		return 0;
	}
	if(fl==1) id[++k]=1;
	if(k%2) id[++k]=1;
	sort(id+1,id+1+k,cmp);
	puts("1");
	for(int i=1;i<=k/2;i++)
		match(id[i],id[i+k/2]);
	for(int i=2;i<=n;i++)
		if(cnt<(n+5)/6)
		{
			printf("%d %d\n",1,i);
			cnt++;
		}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM