CF547D Mike and Fish 建圖

題意:

  有點長→CF547DMike and Fish。node

 

分析:

  其實也沒什麼好分析的,我這也是看的題解。c++

  (不過,那篇題解好像文字的代碼不太對勁)ide

  這裏直接說作法,正確性自證:spa

  對輸入的,將橫、縱座標相等的點分別兩兩連邊,以後只須要dfs跑一個染色,使得一條邊兩個端點顏色都不同便可,這樣就能夠肯定每個點放紅色仍是藍色,輸出便可。(至於哪一個是紅哪一個是藍不重要,有spj)code

代碼:blog

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=500005;int n,m;
 4 struct node{int y,nxt;}e[2*N];
 5 int h[N],c=1,vis[N],ans[N][2];
 6 void add(int x,int y){
 7     e[++c]=(node){y,h[x]};h[x]=c;
 8     e[++c]=(node){x,h[y]};h[y]=c;
 9 } void dfs(int x,int y){
10     if(vis[x]) return ;vis[x]=y;
11     for(int i=h[x];i;i=e[i].nxt)
12     dfs(e[i].y,1^y);
13 } int main(){
14     scanf("%d",&n);
15     for(int i=1,x,y;i<=n;i++){
16         scanf("%d%d",&x,&y);
17         if(ans[x][0]) 
18         add(ans[x][0],i),ans[x][0]=0;
19         else ans[x][0]=i;
20         if(ans[y][1])
21         add(ans[y][1],i),ans[y][1]=0;
22         else ans[y][1]=i;
23     } for(int i=1;i<=n;i++){
24         dfs(i,0);
25         if(vis[i]) putchar('r');
26         else putchar('b');
27     } return 0;
28 }
染色
相關文章
相關標籤/搜索