Codeforces Round #306 (Div. 2) D - Regular Bridge 构造

来源:互联网 发布:c语言sqrt函数 编辑:程序博客网 时间:2024/05/22 00:54

D - Regular Bridge 题意:问能不能构造出这样一张图,使得每个点的度为k,且至少有一个桥。

k为偶数时一定不满足。可以这么想,一张图通过桥分为对称的两部分,那么只需要构造出一部分,另一部分也就一样了。那么假设某点和桥相连,去掉桥这条边之后,该点度数为k-1,为奇数,而该部分里面其他点的度数=k为偶数。而可知,该部分的图是一张强连通图,由握手定理得,强连通图里面度数为奇数的点数一定为偶数,与当前只有一个奇数点(即与桥相连的那个点)矛盾。所以k为偶数一定不满足。

当k为奇数时,k>=3时,令n = 2*k+4.(来自官方题解,,)k-1个顶点 再选择 k-1个顶点 连边,即2~k间相互连,    另外2个顶点 就要选择k个顶点连边,即另外两个顶点,先和2~k连,这样一共是k-1了,再相互连一下,2~k之间相互连,然后满足这种 2~3, 4~5 的不要,就是k-2了,再与1连,就是k-1,最后和另外两个连,就是k另外2个顶点 就要选择k个顶点连边,即另外两个顶点,先和2~k连,这样一共是k-1了,再相互连一下,就是k。

详见代码

const int N = 110;vector <int> v[N<<1];int n, m, k;int main(){    while( ~scanf("%d", &k) ) {        if( k % 2 == 0 ) {            puts("NO");            continue;        }        else if( k == 1 ) {            puts("YES");            printf("2 1\n1 2\n");            continue;        }        else {            puts("YES");            n = 2 * k + 4, m = n * k / 2;            int x = k+2;            for( int i = 1; i <= (x<<1)+3; ++i )                v[i].clear();            v[1].push_back( 1+x );            for( int i = 2; i <= k; ++i ) {                v[1+x].push_back(i+x);                v[1].push_back(i);            }            for( int i = 2; i <= k; ++i ) {                for( int j = i+1; j <= k; ++j ) {                    if( i % 2 == 0 && i+1 == j )                        continue;                    v[i].push_back(j);                    v[i+x].push_back(j+x);                }                v[i].push_back( k+1 );                v[i].push_back( k+2 );                v[i+x].push_back( x+k+1 );                v[i+x].push_back( x+k+2 );            }            v[k+1].push_back(k+2);            v[x+k+1].push_back(x+k+2);            printf("%d %d\n", n, m);            for( int i = 1; i <= x*2; ++i ) {                int sz = v[i].size();                for( int j = 0; j < sz; ++j ) {                    printf("%d %d\n", i, v[i][j]);                }            }        }    }    return 0;}


0 0
原创粉丝点击