CodeForces 741C Arpa’s overnight party and Mehrdad’s silent entering

给定2n个人围成一圈,包含n对情侣,需分配两种不同的食物使得每对情侣食物不同且任意连续三人食物不全相同。通过构建边并染色的方法解决,确保环的长度为偶数,保证有解,时间复杂度为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意

2n 个人坐成一圈,给定 n 对情侣,男的在a,女的在 b
现在有两种食物分配给这些人,要求每一对情侣分得食物不同,还要求任意连续三人至少有两种食物。
求分配方案。

Data Constraint
n105

题解

先每队情侣之间连双向边。
12,34,56... 之间连双向边。
每条边表示这两个位置分到的食物不同。
连完边后染一遍色。
正确性:每次连边的时候环的长度必然是偶数,所以是一定有解的。

时间复杂度: O(n)

SRC

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std ;

#define N 100000 + 10
#define M 10000000 + 10
struct Couple {
    int a , b ;
} P[N] ;

bool flag = 1 ;
int Node[M] , Next[M] , Head[M] , tot ;
int Col[M] , D[M] ;
int n ;

void link( int u , int v ) {
    Node[++tot] = v ;
    Next[tot] = Head[u] ;
    Head[u] = tot ;
}

void Insert( int u , int v ) { link(u,v) , link(v,u) ; }

void BFS( int st ) {
    int i = 0 , j = 1 ;
    D[1] = st ;
    Col[st] = 1 ;
    while ( i < j ) {
        i ++ ;
        int now = D[i] ;
        for (int p = Head[now] ; p ; p = Next[p] ) {
            if ( Col[Node[p]] && Col[Node[p]] != 3 - Col[now] ) { flag = 0 ; return ; }
            if ( Col[Node[p]] ) continue ;
            Col[Node[p]] = 3 - Col[now] ;
            D[++j] = Node[p] ;
        }
    }
}

int main() {
    scanf( "%d" , &n ) ;
    for (int i = 1 ; i <= n ; i ++ ) {
        scanf( "%d%d" , &P[i].a , &P[i].b ) ;
        Insert( P[i].a , P[i].b ) ;
    }
    for (int i = 1 ; i <= 2 * n ; i += 2 ) Insert( i , i + 1 ) ;
    for (int i = 1 ; i <= 2 * n && flag ; i ++ ) {
        if ( Col[i] ) continue ;
        BFS(i) ;
    }
    if ( !flag ) { printf( "-1\n" ) ; return 0 ; }
    for (int i = 1 ; i <= n ; i ++ ) {
        printf( "%d %d\n" , Col[P[i].a] , Col[P[i].b] ) ;
    }
    return 0 ;
}

以上.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值