染色问题

同染色(连接点染相同颜色)

用法

得到各个连通分量(分组)。

代码

#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是因为简单:)。