1. 程式人生 > 實用技巧 >牛客演算法週週練20 F.紫魔法師 (二分圖染色)

牛客演算法週週練20 F.紫魔法師 (二分圖染色)

  • 題意:給你一張圖,對其染色,使得相連的點的顏色兩兩不同求,最少使用多少種顏色.

  • 題解:首先,若\(n=1\),只需要一種.然後我們再去判斷是否是二分圖,對於二分圖,兩種顏色就夠了,若不是二分圖,也就是可能存在奇環的情況,那麼三種顏色鐵夠了.所以題目就轉化成了判斷是否是二分圖.

  • 程式碼:

    int n,m;
    int u,v;
    int color[N];
    vector<int> V[N];
    
    bool dfs(int u,int c){
    	color[u]=c;
    
    	for(auto w:V[u]){
    		if(!color[w]){
    			if(!dfs(w,3-c)) return false;
    		}
    		else{
    			if(color[w]==c) return false;
    		}
    	}
    	return true;
    }
    
    int main() {
        //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    	scanf("%d %d",&n,&m);
    
    	for(int i=1;i<=m;++i){
    		scanf("%d %d",&u,&v);
    		V[u].pb(v);
    		V[v].pb(u);
    	}
    	if(n==1){
    		puts("1");
    		return 0;
    	}
    	bool flag=true;
    	for(int i=1;i<=n;++i){
    		if(!color[i]){
    			if(!dfs(i,1)){
    				flag=false;
    				break;
    			}
    		}
    	}
    
    	if(!flag) puts("3");
    	else puts("2");
    
        return 0;
    }