1. 程式人生 > >圖的染色【洛谷P1330】

圖的染色【洛谷P1330】

這是個圖的染色問題。題目看起來很複雜,但是仔細分析可以發現,將相鄰結點染成不同的顏色,這樣就保證了相鄰的點不同時選擇。然後判斷一下染色後的每一塊,將較少的顏色的個數加起來就是答案。

重點是關注圖怎麼染色,怎麼將相鄰的點染成不同的顏色。

PS:本題還有並查集的做法,效率很高。我看懂了之後會更新一下並查集的做法。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
vector<int> G[maxn];
int sum[2];
int col[maxn];
int vis[maxn];
bool dfs(int now,int color)
{
	if(vis[now])
	{
		if(col[now]==color) return true;
		return false;
	}
	vis[now] = 1;
	sum[col[now]=color]++;
	bool found = true; 
	for(int i=0;i<G[now].size();i++)
	{
		found = found && dfs(G[now][i],1-color);
	}
	return found;
}
int main()
{
	int n,m;
	cin>>n>>m;
	int ans = 0;
	for(int i=0;i<m;i++)
	{
		int x,y;
		cin>>x>>y;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	for(int i=1;i<=n;i++)
	{
		if(vis[i]) continue;
		sum[0] = sum[1] = 0;
		if(!dfs(i,0))
		{
			cout<<"Impossible"<<endl;
			return 0;
		}
		ans += min(sum[0],sum[1]);
	}
	cout<<ans<<endl;
	return 0;
}