1. 程式人生 > >圖論 競賽圖(tournament)學習筆記

圖論 競賽圖(tournament)學習筆記

競賽圖(tournament)學習筆記

現在只是知道幾個簡單的性質。。。

競賽圖也叫有向完全圖。

其實就是無向完全圖的邊有了方向。

​ 有一個很有趣的性質就是:一個tournament要麼沒有環,如果有環,那麼必然有一個三元環。當然,tournament一定沒有自環和二元環。

​ 證明的話,開始吧,,

​ 首先我們假定當前的tournament存在一個N元環,那麼我們設A,B,C為這個N元環上連續的三個點,那麼就會存在AB和BC兩條邊,又因為是競賽圖,所以一定會存在AC或者CA兩者中的一條邊。

​ 又可以開始開心地分情況討論了:

​ (一),存在CA邊,那麼很開心,我們已經找到了三元環ABC。

​ (二),存在AC邊,那麼我們就會發現B這個點是沒有用的了,比如這樣:

那麼我們就可以把一個N元環變成N-1元環了。

那麼就一定會縮小到3元環了。

上述性質例題:

CF117C Cycle

一個tournament是一個沒有自環的有向圖,同時,每兩個點之間有一條邊連線。這就是說,對於兩個點u,v(u≠v),有一條從u到v的邊或一條從v到u的邊。

給你一個tournament,請找出一個長度為3的環。

直接按照上述性質模擬就好了。

code:

#include <iostream>
#include <cstdio>

using namespace std;

const int wx=5017;

inline int read(){
    int sum=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();}
    return sum*f;
}

char s[wx][wx];
int vis[wx];
int n;

bool dfs(int u,int fa){
    vis[u]=1;
    for(int i=1;i<=n;i++){
        if(s[u][i]-'0'){
            if(s[i][fa]-'0'){
                printf("%d %d %d\n",fa,u,i);
                return true;
            }
            if(!vis[i])if(dfs(i,u))return true;
        }
    }
    return false;
}

int main(){
    n=read();
    for(int i=1;i<=n;i++)
        scanf("%s",s[i]+1);
    int fl=0;
    for(int i=1;i<=n;i++)
        if(!vis[i])
            if(dfs(i,i))return 0;;
    puts("-1");
    return 0;
}

關於其他性質:

1:任意競賽圖都有哈密頓路徑(經過每個點一次的路徑,不要求回到出發點)。

2:競賽圖存在哈密頓迴路的充要條件是強聯通。

先留坑。