代码:
View Code
#include <stdio.h>
#include <string.h>
int A[10][10],B[10][10];
int vary[10];
bool flag[10];
int small1,small2,min;
void action(int n)
{
int i,j,val=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(A[vary[i]][vary[j]]==B[i][j]) continue;
if(A[vary[i]][vary[j]])
val+=small2;
else
val+=small1;
}
}
if(val<min) min=val;
}
void DFS(int pos,int n)
{
int i;
if(pos==n) {action(n); return ; }
for(i=0;i<n;i++)
{
if(flag[i])
{
vary[pos]=i;
flag[i]=false;
DFS(pos+1,n);
// 原来->DFS(++pos,n);考,给力!递归中pos的值再回溯时,pos的值就变了...
// 狂汗!!
flag[i]=true;
}
}
}
void solve()
{
int n,Ma,Mb,Ia,Ib,Da,Db;
int i,a,b,cas=0;
while(scanf("%d %d %d",&n,&Ma,&Mb) && n)
{
scanf("%d %d %d %d",&Ia,&Ib,&Da,&Db);
small1=(Ia<Db?Ia:Db);
small2=(Ib<Da?Ib:Da);
min=0xfffffff;
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
for(i=0;i<Ma;i++)
{
scanf("%d %d",&a,&b);
A[a][b]=A[b][a]=1;
}
for(i=0;i<Mb;i++)
{
scanf("%d %d",&a,&b);
B[a][b]=B[b][a]=1;
}
scanf("\n");
for(i=0;i<n;i++) flag[i]=true;
DFS(0,n);
printf("Case #%d: %d\n",++cas,min/2);
}
}
int main()
{
solve();
return 0;
}
我要记录这一刻:
View Code
void DFS(int pos,int n)
{
int i;
if(pos==n) {action(n); return ; }
for(i=0;i<n;i++)
{
if(flag[i])
{
vary[pos]=i;
flag[i]=false;
DFS(++pos,n); //!!!!!!
flag[i]=true;
}
}
}
这个错了,又是找了很长时间!汗死!!!
代码中 DFS(++pos,n); 当回溯是pos的值就变了不是原来的位置了,当然错了!!!
启发:写递归是要特别注意,不变的量,一定不要进行自加操作!!不是特意的就尽量不要用++!!