染色问题
同染色(连接点染相同颜色)
用法
得到各个连通分量(分组)。
代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100;
int graph[MAXN][MAXN];
int color[MAXN];
int cnt; //连通分量数量
void dfs(int index,int n,int c)
{
color[index]=c;
for(int i=0;i<n;i++) if(graph[index][i]&&!color[i]) dfs(i,n,c);
}
int main()
{
int n,m;
cin >> n >> m;
for(int i=0;i<m;i++)
{
int s,t;
cin >> s >> t;
graph[s][t]=1,graph[t][s]=1;
}
for(int i=0;i<n;i++)
{
if(!color[i])
{
cnt++;
dfs(i,n,cnt);
}
}
vector<vector<int>> group(cnt+1,vector<int>());
for(int i=0;i<n;i++) group[color[i]].push_back(i);
for(int i=1;i<=cnt;i++)
{
cout << "颜色" << i << ":";
for(int j=0;j<group[i].size();j++) cout << group[i][j] << ' ';
cout << endl;
}
}
异染色(连接点染不同颜色)
用法
得到二分图。
代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100; //假如最大100个结点的图
int graph[MAXN][MAXN];
int color[MAXN]; //用于确定分组,颜色为1和2
int dfs(int index,int n,int c) //仅仅用来染色出发点所在的连通分量
{
//直接用对边不同色考虑
color[index]=c;
for(int i=0;i<n;i++) if(graph[index][i] && (color[i]==c || (color[i]==0 && !dfs(i,n,3-c))) ) return 0;
return 1;
}
int main()
{
int n,m;
cin >> n >> m;
for(int i=0;i<m;i++)
{
int s,t;
cin >> s >> t;
graph[s][t]=1,graph[t][s]=1;
}
for(int i=0;i<n;i++)
{
if(!color[i])
if(!dfs(i,n,1))
{
cout << "错误,不是二分图" << endl;
return 0;
}
}
vector<int> color1,color2;
for(int i=0;i<n;i++)
{
if(color[i]==1) color1.push_back(i);
if(color[i]==2) color2.push_back(i);
}
cout << "染色结果:" << endl;
for(int i=0;i<color1.size();i++) cout << color1[i] << ' ';
cout << endl;
for(int i=0;i<color2.size();i++) cout << color2[i] << ' ';
return 0;
}
注
这两个染色问题都可以用邻接矩阵做。我用int-MAXN是因为简单:)。