#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
class Guardian
{ friend int MaxGuardian(int **, int [], int);
private:
void Backtrack(int i);
int **a, //图G的邻接矩阵
n, //图G的顶点数
*x, //当前解
*bestx, //当前最优解
cn, //当前顶点数
bestn; //当前最大顶点数
};
void Guardian::Backtrack(int i)
{
if(i>n)
{
for(int i=1;i<=n;i++)
{
bestx[i]=x[i];
}
bestn=cn;
return;
}
else
{
int OK=1;
for(int j=1;j<i;j++)
{
if((x[j]==1)&&(a[j][i]==1))//如果选中的这个人i和先前选中的i-1个人有仇敌关系 则break出去
{
OK=0;
break;
}
}
if(OK)//则进入左子树
{
x[i]=1;
cn++;
Backtrack(i+1);
x[i]=0;
cn--;
}
if(cn+n-i>bestn)//进入右子树
{
x[i]=0;
Backtrack(i+1);
}
}
}
int MaxGuardian(int **a, int v[], int n)
{ Guardian Y; //初始化Y
Y.x=new int[n+1];
Y.a=a;
Y.n=n;
Y.cn=0;
Y.bestn=0;
Y.bestx=v;
Y.Backtrack(1);
delete[] Y.x;
printf("守卫为:");
for(int i=1;i<=n;i++)
printf("%d ",Y.bestx[i]);
return Y.bestn;
}
int main()
{
ifstream input("d:\input.txt");
// ofstream output("c:\output.txt");
int n,m;
input>>n;
input>>m;
int **a;
int *v=new int [n+1];
a=(int **)malloc(sizeof(int *)*(n+1));
for(int i=1;i<=n;i++)
{
a[i]=(int *)malloc(sizeof(int)*(n+1));
}
for(int i=1;i<=n;i++)//仇敌关系矩阵初始化,置为0
for(int j=1;j<=n;j++)
{
a[i][j]=0;
}
for(int i=1;i<=m;i++)//输入仇敌关系矩阵
{
int r,c;
input>>r;
input>>c;
a[r][c]=1;
}
n=MaxGuardian(a,v,n);
printf("guardian=%d",n);
input.close();
//output.close();
return 0;
}
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以
声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
friend 类型 函数名(形式参数);
1.友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
2.一个函数可以是多个类的友元函数,只需要在各个类中分别声明。友元函数的调用与一般函数的调用方式和原理一致。