zoukankan      html  css  js  c++  java
  • Codeforces 323 B Tournament-graph

    Discription

    In this problem you have to build tournament graph, consisting of n vertices, such, that for any oriented pair of vertices (v, u(v ≠ u) there exists a path from vertexv to vertex u consisting of no more then two edges.

    A directed graph without self-loops is a tournament, if there is exactly one edge between any two distinct vertices (in one out of two possible directions).

    Input

    The first line contains an integer n (3 ≤ n ≤ 1000), the number of the graph's vertices.

    Output

    Print -1 if there is no graph, satisfying the described conditions.

    Otherwise, print n lines with n integers in each. The numbers should be separated with spaces. That is adjacency matrix a of the found tournament. Consider the graph vertices to be numbered with integers from 1 to n. Then av, u = 0, if there is no edge from v to u, and av, u = 1 if there is one.

    As the output graph has to be a tournament, following equalities must be satisfied:

    • av, u + au, v = 1 for each v, u (1 ≤ v, u ≤ nv ≠ u);
    • av, v = 0 for each v (1 ≤ v ≤ n).

    Example

    Input
    3
    Output
    0 1 0
    0 0 1
    1 0 0
    Input
    4
    Output
    -1


    构造题,比较迷。
    首先我们如果有了n个点的合法图是很容易构造出n+2个点的合法图的。
    首先可以把1的入点看成一类点,1的出点看成一类点,然后再加上1本身和n+1和n+2,我们现在就有了5个点。
    而我们的目的是让任意一对点都在至少一个三元环 (形如a->b,b->c,c->a) 出现。
    所以直接xjb构造就行了,这个其实可以不用手算,直接写个程序跑一跑也是可以的2333(我是不会告诉你们我的连边方案就是电脑枚举出来的哈哈)

    但是发现4没有答案,导致我一开始以为偶数都是gg的然后就WA了。。。
    后来写了个搜索发现6是有答案的2333,所以是偶数的话特判完了之后直接从6的图往后跑就行了,n=6的图可以搜索也可以手玩(反正写搜索就当练暴力了2333)
    #include<bits/stdc++.h>
    #define ll long long
    #define maxn 1005
    using namespace std;
    int a[maxn][maxn];
    int n,m,k,tone[maxn];
    int main(){
    	scanf("%d",&n);
    	if(!(n&1)){
    		if(n<6){
    			puts("-1");
    			return 0;
    		}
    		
    		a[1][5]=a[1][6]=1;
    		a[2][1]=a[2][6]=1;
    		a[3][1]=a[3][2]=a[3][5]=1;
    		a[4][1]=a[4][2]=a[4][3]=1;
    		a[5][2]=a[5][4]=1;
    		a[6][3]=a[6][4]=a[6][5]=1;
    		
    		tone[2]=tone[3]=tone[4]=1;
    		
    		for(int i=7;i<=n;i+=2){
    			tone[i]=1;
    			a[i][1]=1,a[1][i+1]=1,a[i+1][i]=1;
    			for(int j=2;j<i;j++){
    				if(tone[j]) a[j][i]=1,a[i+1][j]=1;
    				else a[j][i+1]=1,a[i][j]=1;
    			}
    		}
    	}
    	else{
    		a[1][2]=a[2][3]=a[3][1]=1;
    		tone[3]=1;
    		for(int i=4;i<=n;i+=2){
    			tone[i]=1;
    			a[i][1]=1,a[1][i+1]=1,a[i+1][i]=1;
    			for(int j=2;j<i;j++){
    				if(tone[j]) a[j][i]=1,a[i+1][j]=1;
    				else a[j][i+1]=1,a[i][j]=1;
    			}
    		}
    	}	
    
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++) printf("%d ",a[i][j]);
    		puts("");
    	}
    
    	
    	/*
    	for(int i=1;i<=n;i++)
    	    for(int j=1;j<=n;j++) a[i][j]=(a[i][j]?1:1<<30);
    	for(int i=1;i<=n;i++) a[i][i]=0;
    	
    	for(int k=1;k<=n;k++)
    	    for(int i=1;i<=n;i++)
    	        for(int j=1;j<=n;j++) if(a[i][k]+a[k][j]<a[i][j]) a[i][j]=a[i][k]+a[k][j];
    	        
    	for(int i=1;i<=n;i++)
    	    for(int j=1;j<=n;j++) if(a[i][j]>2) puts("No");
    	*/
    	
    	return 0;
    }
    
    
    

      

     
  • 相关阅读:
    开始学习编写用于 Windows SideShow 设备的小工具【转】
    Windows Mobile 6.5 Developer Tool Kit 下载
    Microsoft Security Essentials 微软免费杀毒软件下载
    SQL Server 2008 空间数据存储摘抄(SRID 点 MultiPoint LineString MultiLineString 多边形 MultiPolygon GeometryCollection)
    Vista Sidebar Gadget (侧边栏小工具)开发教程 (2)
    Vista Sidebar Gadget (侧边栏小工具)开发教程 (4)
    负载测试、压力测试和性能测试的异同
    Windows Server 2008 Vista Sidebar Gadget (侧边栏小工具) 入门开发实例
    Silverlight Tools 安装失败 解决办法
    SQL Server 2008 空间数据库 空间索引概念及创建(取自帮助)
  • 原文地址:https://www.cnblogs.com/JYYHH/p/8535153.html
Copyright © 2011-2022 走看看