1. 程式人生 > >【Henu ACM Round#16 C】Graph and String

【Henu ACM Round#16 C】Graph and String

bool http fin clas const post sin ces log

【鏈接】 我是鏈接,點我呀:)
【題意】


在這裏輸入題意

【題解】


根據題意:先明確以下規則:
1.如果兩個點之間沒有邊,那麽這兩個點只能是a或c,且不能相同
2.如果兩個點之間有邊,那麽他們之間的差的絕對值<=1

那麽對於點i,如果它和所有的點都相連了,那麽就幹脆把他變成b.
這樣其他點無論選什麽都和它沒有關系,其他點選什麽都可以了

接下裏,找到任意一個點j,且點j沒有和所有的點相連。
顯然這個點只能為a或c,因為它和某個點之間沒有邊。【規則1】

那麽我們就讓這個點j設置為a;

①然後對於和j相連的所有點k,且點k不為b(即k不與其他所有點相連),那麽點k
只能為a或c(因為k和某個點之間沒有邊)【規則1】

而根據【規則2】可知點k只能為a

②對於和j不相連的所有點k,顯然k只能為c

根據①和②
會發現所有的點都已經染上色了
而點j為a或c其實不影響答案。

所以再O(n^2)根據規則判斷一下這個染色是否可行就好了。

【代碼】

#include <bits/stdc++.h>
using namespace std;

const int N = 500+10;

int c[N],n,m,chu[N+10];
bool b[N][N];

int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    #ifdef LOCAL_DEFINE
        freopen("rush.txt"
,"r",stdin); #endif cin >> n >> m; for (int i = 1;i <= m;i++){ int x,y; cin >> x >> y; b[x][y] = b[y][x] = true; chu[x]++;chu[y]++; } for (int i = 1;i <= n;i++) if (chu[i]==(n-1)) c[i] = 2
; for (int i = 1;i <= n;i++) if (c[i]!=2){ c[i] = 1; for (int j = 1;j <= n;j++) if (b[i][j] && c[j]!=2){ c[j] = 1; }else if (i!=j && !b[i][j]){ c[j] = 3; } break; } for (int i = 1;i <= n;i++) for (int j = 1;j <= n;j++) if (b[i][j]){ if (abs(c[i]-c[j])>1) return cout<<"No"<<endl,0; }else if (i!=j){ if (abs(c[i]-c[j])<=1) return cout<<"No"<<endl,0; } cout<<"Yes"<<endl; for (int i = 1;i <= n;i++){ if (c[i]==1) cout<<'a'; if (c[i]==2) cout<<'b'; if (c[i]==3) cout<<'c'; } return 0; }

【Henu ACM Round#16 C】Graph and String