1. 程式人生 > >洛谷 P3496 [POI2010]GIL-Guilds

洛谷 P3496 [POI2010]GIL-Guilds

eof net wid lar ogr ima 一個 acc find

P3496 [POI2010]GIL-Guilds

題目描述

King Byteasar faces a serious matter.

Two competing trade organisations, The Tailors Guild and The Sewers Guild asked, at the same time, for permissions to open their offices in each town of the kingdom.

There are 技術分享圖片 towns in Byteotia.

Some of them are connected with bidirectional roads.

Each of the guilds postulate that every town should:

have an office of the guild, or be directly connected to another town that does.

The king, however, suspects foul play. He fears that if there is just a single town holding the offices of both guilds, it could lead to a clothing cartel.

For this reason he asks your help.

給一張無向圖,要求你用黑白給點染色,且滿足對於任意一個黑點,至少有一個白點和他相鄰;對於任意一個白點,至少有一個黑點與他相鄰,問能否成功

輸入輸出格式

輸入格式:

Two integers, 技術分享圖片 and 技術分享圖片 (技術分享圖片, 技術分享圖片), are given in the first line of the standard input. These denote the number of towns and roads in Byteotia, respectively.

The towns are numbered from 技術分享圖片 to 技術分享圖片.

Then the roads are given as follows: the input line no. 技術分享圖片

describes the 技術分享圖片-th road; it holds the numbers 技術分享圖片 and 技術分享圖片 (技術分享圖片, 技術分享圖片), denoting that the ![](http://main.edu.…

輸出格式:

Your program should print out one word in the first line of the standard output:

TAK (yes in Polish) - if the offices can be placed in towns according to these rules, or NIE (no in Polish) - in the opposite case.

If the answers is TAK, then the following 技術分享圖片 lines should give an exemplary placement of the offices. Thus the line no. 技術分享圖片should hold:

the letter K if there should be an office of The Tailors Guild in the town 技術分享圖片, or the letter S if there should be an office of The Sewers Guild in the town 技術分享圖片, or the letter N if there should be no office in the town 技術分享圖片.

輸入輸出樣例

輸入樣例#1: 復制
7 8
1 2
3 4
5 4
6 4
7 4
5 6
5 7
6 7
輸出樣例#1: 復制
TAK
K
S
K
S
K
K
N
思路:可以得到一個結論,只要沒有度數為0的點就一定可以。
然後寬搜染色就可以了。
技術分享圖片
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 500010
using namespace std;
queue<int>que;
int n,m,tot;
int fa[MAXN],col[MAXN],into[MAXN];
int to[MAXN*2],net[MAXN*2],head[MAXN];
int find(int x){
    if(fa[x]==x)    return fa[x];
    else return fa[x]=find(fa[x]);
}
void add(int u,int v){
    to[++tot]=v;net[tot]=head[u];head[u]=tot;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)    fa[i]=i;
    for(int i=1;i<=m;i++){
        int x,y;scanf("%d%d",&x,&y);
        add(x,y);add(y,x);into[x]++;into[y]++;
        int dx=find(x);int dy=find(y);fa[dy]=dx;
    }
    for(int i=1;i<=n;i++)
        if(into[i]==0){ printf("NIE\n");return 0;}
    memset(col,-1,sizeof(col));
    for(int i=1;i<=n;i++)
        if(fa[i]==i){ que.push(i);col[i]=1; }
    while(!que.empty()){
        int now=que.front();
        que.pop();
        for(int i=head[now];i;i=net[i])
            if(col[to[i]]==-1){
                col[to[i]]=(col[now]==1?0:1);
                que.push(to[i]);
            }
    }
    printf("TAK\n");
    for(int i=1;i<=n;i++)
        if(col[i]==1)    printf("K\n");
        else    printf("S\n");
}

 

洛谷 P3496 [POI2010]GIL-Guilds