poj1129 平面图点着色

题意:当一个广播电台在一个非常大的地区,广播站会用中继器来转播信号以使得每一个接收器都能接收到一个强烈的信号。然而,每个中继器必须慎重选择使用,使相邻的中继器不互相干扰。如果相邻的中继器使用不同的频道,那么就不会相互干扰。由于无线电频道是一有限的,一个给定的网络所需的中继频道数目应减至最低。编写一个程序,读取一个中继网络,然后求出需要的最低的不同频道数。

分析:一个有N个节点的无向图,要求对每个节点进行染色,使得相邻两个节点颜色都不同,问最少需要多少种颜色?那么题目就变成了一个经典的图的染色问题。可以直接暴力(把所有情况都试探一下),当然利用四色定理将复杂度优化下来,我优化到了O(3^n)。或者使用紫书P286的dp做法。

参考:https://blog.csdn.net/lyy289065406/article/details/6647986https://blog.csdn.net/gauss_acm/article/details/44039691

代码:

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

char s[Maxn];
int adj[Maxn][Maxn];
int color[Maxn];
int n;
int ans;
bool check(int u,int c){
    for(int v=0;v<u;v++)
        if(adj[u][v]&&color[v]==c)
            return false;
    return true;
}
void dfs(int d){
    if(d==n){
        ans=min(ans,*max_element(color,color+n));
        return;
    }
    for(int c=1;c<4;c++)
        if(check(d,c)){
            color[d]=c;
            dfs(d+1);
        }
}
void solve(){
    color[0]=1;
    ans=4;
    dfs(1);
}

int main()
{
    while(cin>>n,n){
        memset(adj,0,sizeof adj);
        for(int i=0;i<n;i++){
            cin>>s;
            for(int j=2;s[j];j++)
                adj[i][s[j]-'A']=adj[s[j]-'A'][i]=1;
        }
        solve();
        if(ans==1) printf("1 channel needed.\n");
        else printf("%d channels needed.\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/tianwei0822/article/details/94547892
今日推荐