ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1696F Tree Recovery

2022-06-26 23:03:46  阅读:145  来源: 互联网

标签:CF1696F rand Recovery int Tree long Id ds define


题面传送门
非常离谱,比赛的时候睡着了!然后错失大好上分机会。
考虑如果我们钦定一个点为根,那么每个点会被分到一个组中,这个点到根的距离和其它点都相同。
如果我们知道了一个点和根是相邻的,那么我们将根换到这个点上来,原来的根对应的组都是和当前的根相邻的,继续换下去就可以构造出整颗树。
但是这棵树不一定合法所以我们还要检验。
至于和根相邻的那个点直接爆枚就好了,时间复杂度\(O(n^4)\)但是跑得不慢。
code:

#include<bits/stdc++.h>
#define I inline
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
#define ll long long
#define db double
#define lb long db
#define N (100+5)
#define M (30000+5)
#define K (6)
#define mod 1000000007
#define Mod (mod-1)
#define eps (1e-9)
#define ull unsigned ll
#define it iterator
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) (n*(x-1)+(y))
#define R(n) (1ll*rand()*rand()%(n)+1)
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using namespace std;vector<int> G[N];
int Rt,n,m,k,x,y,z,D[N][N],B[N],Bh,C[N],Ch,fa[N];char s[N][N][N];
I void dfs(int x,int La,int Id,int ds){D[Id][x]=ds;for(int i:G[x]) i^La&&(dfs(i,x,Id,ds+1),0);}
I void Solve(){
	int i,j,h,k;scanf("%d",&n);for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) scanf("%s",s[i][j]+1),Mc(s[j][i],s[i][j]);
	Rt=1;for(i=2;i<=n;i++){
		for(j=1;j<=n;j++) G[j].clear(),fa[j]=0;B[Bh=1]=i;fa[i]=Rt;for(j=1;j<=n;j++) s[i][j][Rt]^'0'&&(B[++Bh]=j,fa[j]=Rt);
		while(1){
			Ch=0;for(j=1;j<=n;j++) {if(fa[j]) continue;for(h=1;h<=Bh;h++) if(s[fa[B[h]]][j][B[h]]^'0') {C[++Ch]=j;fa[j]=B[h];break;}}
			if(!Ch) break;Bh=Ch;Mc(B,C);
		}int Ps=0;for(j=2;j<=n;j++) if(!fa[j]) Ps=1;if(Ps) continue;
		for(j=2;j<=n;j++) G[fa[j]].PB(j),G[j].PB(fa[j]);for(j=1;j<=n;j++) dfs(j,j,j,0);
		for(j=1;j<=n;j++) for(h=j+1;h<=n;h++) for(k=1;k<=n;k++) if((s[j][h][k]-'0')^(D[j][k]==D[h][k])) {Ps=1;break;}
		if(Ps) continue;puts("Yes");for(j=2;j<=n;j++) printf("%d %d\n",j,fa[j]);return;
	}puts("No");
}
int main(){
//////	freopen("1.in","r",stdin);
	int T;scanf("%d",&T);while(T--) Solve();
}

标签:CF1696F,rand,Recovery,int,Tree,long,Id,ds,define
来源: https://www.cnblogs.com/275307894a/p/16414631.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有