poj 1129 Channel Allocation (dfs)

鏈接:poj 1129

題意如果相鄰的中繼器使用不同的頻道,就不會相互干擾

給定一些中繼器的相鄰關係,至少要選幾個不同的頻道,使得中繼器都不互相干擾。

分析:這題可以轉化爲無向圖的染色問題,

即相鄰的點不能染同一種顏色,求至少需要的幾種顏色?

本題頂點數最多爲26,可以直接用暴力搜索即可

思路:若頂點總數爲n,則最多需要n種顏色(編號爲1,2...n),

從最小的頂點開始染色,每次將與該頂點相鄰的已染色的顏色標記,

再從未標記(未用)的顏色中,選出一個最小的顏色,給該點染色,

所有點染色完後,再統計用了幾種顏色就是所求答案.

注:如果答案爲1時,輸出的channel爲單數,否則爲複數channels


#include<stdio.h>
#include<string.h>
int main()
{
    int n,i,j,vis[30],color[30],sum;
    char s[30];
    while(scanf("%d",&n)!=EOF){
        if(n==0)
            break;
        memset(color,0,sizeof(color));  
        for(i=0;i<n;i++){
            scanf("%s",s);
            memset(vis,0,sizeof(vis));
            for(j=2;s[j]!='\0';j++)  //標記相鄰頂點所染的顏色
                if(color[s[j]-'A'])
                    vis[color[s[j]-'A']]=1;
            for(j=1;j<=n;j++)      //找到最小的未被用的顏色,給頂點i染色
                if(!vis[j]){
                    color[i]=j;  //給頂點i染j顏色
                    break;
                }
        }
        memset(vis,0,sizeof(vis));
        sum=0;
        for(i=0;i<n;i++){      //統計所用不同顏色的種數
            if(!vis[color[i]]){
                sum++;
                vis[color[i]]=1;
            }
        }
        if(sum==1)
            printf("%d channel needed.\n",sum);
        else
            printf("%d channels needed.\n",sum);
    }
    return 0;
}


發佈了152 篇原創文章 · 獲贊 7 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章