这道题乍看不难,但是构造过程中发现非常毒瘤,因为有一种情况极难构造。
题意
构造一张完全有向图(即任意两点之间都有一条单向边),使任意两有序点之间的距离不大于
解析
为奇数
题目已知
这种情况比较容易,不多做阐述,可以结合代码理解一下。
for(int i=1;i<n;i++){ bool k=1; for(int j=i+1;j<=n;j++){ if(k) a[i][j]=1; else a[j][i]=1; k^=1; } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ printf("%d ",a[i][j]); } printf("\n"); }
为偶数
我们首先考虑,如果前
然而我们刚开始并不知道偶数个点能不能构造出一张竞赛图,但我们可以在一次 WA 后得到这一结论。
我们已知 毒瘤)的竞赛图。
于是代码就很显然了。
a[1][2]=a[1][3]=a[1][4]=a[2][3]=a[2][4]=a[2][5]= a[3][4]=a[3][6]=a[4][5]=a[4][6]=a[5][1]=a[5][3]= a[6][1]=a[6][2]=1; for(int i=n;i>6;i-=2){ for(int j=1;j<=i-2;j++){ a[j][i-1]=1; a[i][j]=1; } a[i-1][i]=1; } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ printf("%d ",a[i][j]); } printf("\n"); }
我们最后再补充上唯一一种无法构造的情况 ——
if(n==4){ printf("-1\n"); return 0; }
将上述三段代码组合起来就是最终情况了,这里不再赘述。
博主你的代码高亮工具用的是什么插件?
主题 Argon 自带的代码高亮