zoukankan      html  css  js  c++  java
  • 【poj1419】 Graph Coloring

    http://poj.org/problem?id=1419 (题目链接)

    题意

      求一般图最大独立集。

    Solution

      最大独立集=补图的最大团。

    代码

    // poj1419
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    #include<cmath>
    #include<queue>
    #define LL long long
    #define inf 2147483640
    #define Pi acos(-1.0)
    #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
    using namespace std;
     
    const int maxn=200;
    int f[maxn][maxn],c[maxn][maxn],p[maxn],ans[maxn],mx[maxn];
    int n,m,cnt;
    
    void Init() {
    	memset(f,1,sizeof(f));cnt=0;
    	for (int i=1;i<=n;i++) c[0][i]=1;
    }
    void record(int s) {
    	cnt=s;
    	for (int i=1;i<=s;i++) ans[i]=p[i];
    }
    void dfs(int fa,int x,int s) {
    	if (n-x+s<cnt || s+mx[x+1]<cnt) return;   //cut
    	p[s]=x;
    	if (cnt<s) record(s);
    	for (int i=x+1;i<=n;i++) if (c[fa][i] && f[x][i]) c[x][i]=1;
    	for (int i=x+1;i<=n;i++) if (c[fa][i] && f[x][i]) dfs(x,i,s+1);
    	for (int i=x+1;i<=n;i++) c[x][i]=0;
    }
    int main() {
    	int T;scanf("%d",&T);
    	while (T--) {
    		scanf("%d%d",&n,&m);
    		Init();
    		for (int u,v,i=1;i<=m;i++) {
    			scanf("%d%d",&u,&v);
    			f[u][v]=f[v][u]=0;
    		}
    		for (int S=n;S>=1;S--) {   //倒着搜索
    			dfs(0,S,1);
    			mx[S]=cnt;   //记忆化一下
    		}
    		printf("%d
    ",cnt);
    		for (int i=1;i<=cnt;i++) printf("%d ",ans[i]);
    		puts("");
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    StreamWrite写ASCII文本文件时,中文变成问号的处理
    asp.net错误处理封装
    C#减少图片文件大小和尺寸
    关于《代码大全2》
    关于重载
    Oracle移机
    用delphi模仿.net的string.split
    Oracle817搞怪
    oracle取得系统时钟
    15 个新鲜精彩的jQuery教程
  • 原文地址:https://www.cnblogs.com/MashiroSky/p/6192965.html
Copyright © 2011-2022 走看看