独立集
来源:互联网 发布:学吹笛子软件 编辑:程序博客网 时间:2024/05/01 02:22
#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),先删点vfor(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"); //输出耗费为0printf("%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;}