您的位置:首页 > 其它

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

2016-12-09 12:18 417 查看

题目大意

有2n个人坐成一圈,给定n对情侣,男的在a,女的在b。

现在有两种食物分配给这些人,要求每一对情侣分得食物不同,还要求任意连续三人至少有两种食物。

求分配方案。

Data Constraint

n≤105

题解

先每队情侣之间连双向边。

1→2,3→4,5→6...之间连双向边。

每条边表示这两个位置分到的食物不同。

连完边后染一遍色。

正确性:每次连边的时候环的长度必然是偶数,所以是一定有解的。

时间复杂度: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
;

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 ;
}


以上.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐