poj 1129Channel Allocation

/* 解题报告: 解析:转发器网络相当于一个无向图,而临近的转发器使用不同的频道相当于无向图的着色问题。即 四色问题。于是可将该题转化为着色问题 实现: 着色实现: 因为颜色一共就有四种于是可将本题化分为以下两种情况: 1、所有的转发器互不相邻,只要有种颜色 2、用两种或三种颜色去填,看是否可以成功,如果都不成功的话,就需要四 构造无向图: 用二维数组graph实现 */ #include <iostream> #include <cstring> using namespace std; int n;//结点的数量 int graph[26][26];//存无向图 int used[26];//记录每个结点用的颜色 //nColor颜色的各类,nId开始着色的结点0为第一个 bool dfs(int nColor, int nId) { bool bFlag; int i, j; //用每一种颜色开始着色 for(i=0; i<nColor; i++) { bFlag = true; used[nId] = i; //判断相邻的结点是否有相同的颜色 for(j=0; j<nId; j++)//注意此处,由于为从第一个结点开始搜索(该结点以后的没有填充颜色),因此只须判断该结点以前的结束即可 { if(graph[nId][j] && used[nId] == used[j]) { bFlag = false; break; } } if(bFlag && (nId == n-1 || dfs(nColor, nId+1))) return true; } return false; } int main() { int i, j; char szInput[30]; bool bOne; while(cin>>n && n!=0) { bOne = true; memset(graph, 0, sizeof(graph)); memset(used, 0, sizeof(used)); for(i=0; i<n; i++) { cin>>szInput; for(j=2; szInput[j]; j++,bOne = false) { graph[i][szInput[j] - 'A'] = 1; graph[szInput[j] - 'A'][i] = 1; } } if(bOne) cout<<"1 channel needed."<<endl; else if(dfs(2,1)) cout<<"2 channels needed."<<endl; else if(dfs(3,1)) cout<<"3 channels needed."<<endl; else cout<<"4 channels needed."<<endl; } return 0; }

你可能感兴趣的:(网络,Graph,Allocation)