竞赛图

Posted amitherblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了竞赛图相关的知识,希望对你有一定的参考价值。

竞赛图是通过在无向完整图中为每个边缘分配方向而获得的有向图。

转自:https://www.cnblogs.com/acha/p/9042984.html

定理 1

竞赛图强连通缩点后的DAG呈链状, 前面的所有点向后面的所有点连边

技术图片

定理 2

竞赛图的强连通块 存在一条哈密顿回路


技术图片

定理 3

竞赛图存在一条 哈密顿路径

证明 : 如图示方法构造
技术图片

引理

竞赛图里, 大小为 n>1n>1 的强连通块中, 大小为 [3,n][3,n] 的简单环均存在

技术图片

定理4

竞赛图判定定理 Landau‘s Theorem:
sisi为第ii个点的出度 (竞赛中获胜的积分)
ss排好序后, 若满足 ki=1si(k2)s=(n2)∑i=1ksi≥(k2)且∑s=(n2) , 定能构造出一种竞赛图, 反之不能

 

UCF Local Contest 2015

I Longest path

题意:给出一个??(?? ≤ 500)个点的有向图,任意两个点之间有且仅一条有向边。 求一条不重复经过一个点的最长的简单路径。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e9+7;
const int inf=0x3f3f3f3f;
const int maxn=1e5+7;
list<int> List;
int Matrix[505][505];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int N;
        List.clear();
        for(int i=1;i<=N;++i)
            for(int j=1;j<=N;++j)
                scanf("%d",&Matrix[i][j]);
        List.push_back(1);
        for(int i=2;i<=N;++i){
            int CountIn=0,CountOut=0;
            for(auto it:List){
                if(Matrix[i][it]) ++CountOut;
                else ++CountIn;
            }
            if(CountOut==i-1) List.push_front(i);//加入列头 
            else if(CountIn==i-1) List.push_back(i);//加入列尾 
            else{//找到(u,v)(v,w) 
                auto it=List.begin();
                for(;it!=List.end();++it){
                    auto Next=it;++Next;
                    if(Next==List.end()) break;
                    if(Matrix[*it][i] && Matrix[i][*Next]) break;
                }
                List.insert(++it,i);
            }
        }
        int Count=0;
        for(auto it:List){
            ++Count;
            printf("%d",it);
            if(Count<N) printf(" ");
        }
        printf("
");
    }
    return 0;
}

 

以上是关于竞赛图的主要内容,如果未能解决你的问题,请参考以下文章

算法笔记竞赛图(有向完全图)(相关题型总结)

竞赛图

第十六届智能车竞赛备战新进展

CF117C Cycle (竞赛图找环)

Python 和 C++ 下字符串查找速度对比,你觉得Python适合算法竞赛吗

竞赛图如何构造三元环