#include"stdio.h" #include"string.h" const int MAXN = 101; char g[MAXN][MAXN], mark[MAXN],used[MAXN]; //邻接矩阵,标记删点,标点独立集 int n; void dfs(){ //递归算法 int i,j; for(i = 1;i<=n;i++){ //在图G中找任意一个点 if(!mark[i]) break; } if(i > n) return; //如果图为空则返回空集 mark[i] = 1; //删去N(v),先删点v for(j = 1;j <=n; j++) { //删去从v出发直接相邻的点 if(g[i][j]) mark[j] = 1; } dfs(); //递归求解删点后的图H的解S(H) for(j=1;j<=n;j++) { //判断S(H)中有无点和v直接相邻 if(used[j] && g[j][i]) break; } if(j>n) used[i] = 1; //如果没有,则将i加入S(G)中 } int main() { freopen("hospital.in","r",stdin); //打开输入文件 freopen("hospital.out","w",stdout); //打开输出文件 int m,a,b,i; while (scanf("%d%d",&n,&m),n) { //n为0时输入终止 memset(g,0,sizeof(g)); //初始化 while (m--) { //输入数据 scanf("%d%d",&a,&b); g[a][b] = 1; } scanf("%*d"); //无视输入中的无用数据 memset(mark,0,sizeof(mark)); //初始化删点标记数组 memset(used,0,sizeof(used)); //初始化独立集标记数组 dfs(); //递归算法求解 for(i = 1,a=0;i<=n;i++) //统计独立集中有多少个点 if(used[i]) a++; printf("0/n"); //输出耗费为0 printf("%d/n",a); //输出独立集的点数 bool prn = false; //实现以空格隔开输出的控制变量 for (i = 1;i <=n; i++){ //输出独立集 if(used[i]){ if(prn){ //从第二个数开始前面要有空格 printf(" "); }else { prn = true; } printf("%d",i); } } printf("/n"); } return 0; }
独立集
最新推荐文章于 2021-03-09 19:51:43 发布