| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:这题目用回溯法也可以ACIn Reply To:这题目用回溯法也可以AC Posted by:CCNUhaitun at 2009-07-27 20:26:39 #include<stdio.h>
#include<string.h>
#define N 51
int g[N][N],x[N];
int n,MAX,bestn,cn;
void backtrack(int i)
{
int ok=1;
if(i>=n)
{// 到达叶结点
bestn=cn;
return;
}
// 检查顶点 i 与当前团的连接
int j;
for(j=0;j<i;j++)
if(x[j]==1&&!g[i][j])
{// i与j不相连
ok = 0;
break;
}
if(ok) {// 进入左子树
x[i]=1;
cn++;
backtrack(i+1);
cn--;
}
if(cn+n-i>bestn) {// 进入右子树
x[i] = 0;
backtrack(i+1);
}
}
int main() {
int i;
unsigned int j;
char str[100];
while(scanf("%d\n", &n) && n)
{
memset(g, 0, sizeof(g));
memset(x, 0, sizeof(x));
for(i = 0; i < n; i++) {
gets(str);
for(j=2;j<strlen(str);j++)
g[i][str[j]-'A']=1;
}
bestn=cn=0;
backtrack(0);
if(bestn>1)
printf("%d channels needed.\n",bestn);
else
printf("%d channel needed.\n",bestn);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator