http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1084
任务:根据读取的转发器网络的描述信息,求出所需频道的最小使用量
算法分析:本题的转发器网络相当于一个无向图,临近的转发器使用不同的频道相当于无向图的着色问题。相对此题最多需要4中颜色。
当只有一个结点时,只需一种颜色。
否则依次用2和3去求解,如果可以成功,则为求解结果,否则最后结果为4
着色用深度优先搜索进行
View Code
#include<stdio.h> #include<string.h> int n,map[27][27],used[27]; int dfs(int id,int color) { int i,j,flag; for(i=1;i<=color;i++) { used[id]=i; //对结点id着色为i flag = 1; for(j=1;j<id;j++) { if(map[j][id]&&used[j]==used[id])//改颜色已经使用过了 { flag = 0; break; } } //改颜色有效,当所有结点着色完毕返回true,或者给下一个结点着色 if(flag && (id == n || dfs(id+1,color))) return 1; } return 0; } int main() { char str[30]; int i,j,one; while(scanf("%d",&n)!=EOF&&n) { one = 1; memset(map,0,sizeof(map)); for(i=1;i<=n;i++) { scanf("%s",str); for(j=2;str[j];j++,one = 0) map[i][str[j]-'A'+1] = map[str[j]-'A'+1][i] = 1; } used[1]=1; if(one) printf("1 channel needed.\n"); else if(dfs(2,2)) printf("2 channels needed.\n"); else if(dfs(2,3)) printf("3 channels needed.\n"); else printf("4 channels needed.\n"); } return 0; }
View Code
#include<stdio.h> #include<string.h> int n,map[27][27],used[27]; int flag; void dfs(int id,int color) { if(id>n) { flag = 1; return ; } if(!flag) { int i,j,ok; for(i=1;i<=color;i++) { used[id]=i; ok = 1; for(j=1;j<id;j++) { if(map[j][id]&&used[j]==used[id]) { ok = 0; break; } } if(ok) dfs(id+1,color); } } } int main() { char str[30]; int i,j,one; while(scanf("%d",&n)!=EOF&&n) { one = 1; memset(map,0,sizeof(map)); for(i=1;i<=n;i++) { scanf("%s",str); for(j=2;str[j];j++,one = 0) map[i][str[j]-'A'+1] = map[str[j]-'A'+1][i] = 1; } used[1]=1; flag = 0; if(one) printf("1 channel needed.\n"); else { dfs(2,2); if(flag) printf("2 channels needed.\n"); else { dfs(2,3); if(flag) printf("3 channels needed.\n"); else printf("4 channels needed.\n"); } } } return 0; }