[HDOJ 4948] Kingdom [图论+乱搞]

来源:互联网 发布:阿里云备案 编辑:程序博客网 时间:2024/06/05 05:56

已知一个图,任意两对点之间有且仅有一个无向边,没有自环。求一个序列,要求对于序列中任意一个点,其前边的所有点到它的距离都不超过2。

整个图中入度最大的点放在序列的最后...然后删除这个点再次进行这样的操作即可..每次找入读最大的点,放在现有序列的前边..

证明:设入读最大的点为u,有w1,w2,...,wr向其连边,若有一点v与其距离超过2,则v不可能向w1,w2,...,wr连边,即w1,w2,...,wr一定向v连边,然后v也不能向u连边,则u也向v连边,则v的入度至少为r+1。

#include <cstdio>int n;bool a[500][500];int in[500];int ans[500];int main() {int i,j;while (scanf("%d",&n),n) {for (i=0;i<n;i++) in[i]=0;for (i=0;i<n;i++)for (j=0;j<n;j++) {char c=getchar();while (c!='0'&&c!='1') c=getchar();if (c=='1') {a[i][j]=true;in[j]++;} else {a[i][j]=false;}}for (i=n-1;i>=0;i--) {int maxj=0;for (j=0;j<n;j++) if (in[j]>in[maxj]) maxj=j;ans[i]=maxj+1;in[maxj]=-1;for (j=0;j<n;j++) a[j][maxj]=false;for (j=0;j<n;j++) if (a[maxj][j]) {a[maxj][j]=false;in[j]--;}}for (i=0;i<n;i++) printf("%d ",ans[i]);printf("\n");}return 0;}


0 0