二分圖最大獨立集題目彙總 HDU3829,POJ1446、2771

HDU 3829

#include <iostream>
#include <cstdio>
#include <string.h>
#include <vector>
using namespace std;
struct people{
  char ch1,ch2;
  int x,y;
}aa[505];
vector<int> ss[505];
int visted[505],flag[505],panduan[505];
bool dfs(int x){
    for(int i=0;i<ss[x].size();++i){
        if(!visted[ss[x][i]]){
          visted[ss[x][i]]=1;
          if(!flag[ss[x][i]]||dfs(flag[ss[x][i]]))
          {
           flag[ss[x][i]]=x;/*panduan[ss[x][i]]=1;panduan[x]=1;*/
          return true;}
        }
    }
    return false;
}
int main(){
    //freopen("1.txt","r",stdin);
  int n,m,p;
  while(scanf("%d%d%d",&n,&m,&p)!=EOF){
      memset(ss,0,sizeof(ss));
    for(int i=1;i<=p;++i){
        cin>>aa[i].ch1>>aa[i].x>>aa[i].ch2>>aa[i].y;
    }
    for(int i=1;i<=p;++i){
        for(int j=1;j<=p;++j){
            if(aa[i].ch1==aa[j].ch2&&aa[i].x==aa[j].y)
               { ss[i].push_back(j);ss[j].push_back(i);}
        }
    }
    memset(flag,0,sizeof(flag));
    memset(panduan,0,sizeof(panduan));
    int num=0;
    for(int i=1;i<=p;++i){
      memset(visted,0,sizeof(visted));
      //if(!panduan[i])
      if(dfs(i))
      {/*printf("i===%d\n",i);printf("size===%d\n",ss[i].size());*/ num++;}
    }
    printf("%d\n",p-num/2);
  }
  return 0;
}


POJ1446

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
vector<int> ss[505];
int flag[505],visted[505];
bool dfs(int x){
	for(int i=0;i<ss[x].size();++i){
		if(!visted[ss[x][i]]){
		  visted[ss[x][i]]=1;
		  if(flag[ss[x][i]]==-1||dfs(flag[ss[x][i]])){
		    flag[ss[x][i]]=x;
			return true;
		  }
		}
	}
	return false;
}
int main(){
  int n;
  while(~scanf("%d",&n)){
    memset(ss,0,sizeof(ss));
	memset(flag,-1,sizeof(flag));
	int x,num,y,m=n;
	char ch1,ch2,ch3;
	while(m--){
	   cin>>x>>ch1>>ch2>>num>>ch3;
	   while(num--){
	     scanf("%d",&y);
	     ss[x].push_back(y);
	  }
	}
	int sum=0;
	for(int i=0;i<n;++i){
	  memset(visted,0,sizeof(visted));
	  if(dfs(i))
		  sum++;
	}
	printf("%d\n",n-sum/2);
  }
  return 0;
}


POJ 2771

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <string.h>
#include <vector>
#include <string>
using namespace std;
vector<int> ss[505];
int flag[505],visted[505];
struct people{
  int height;
  char male;
  string music;
  string pe;
}aa[505];
bool dfs(int x){
	for(int i=0;i<ss[x].size();++i){
		if(!visted[ss[x][i]]){
		  visted[ss[x][i]]=1;
		  if(flag[ss[x][i]]==-1||dfs(flag[ss[x][i]])){
		    flag[ss[x][i]]=x;
			return true;
		  }
		}
	}
	return false;
}
int main(){
  int t;
  scanf("%d",&t);
  while(t--){
    int n;
	memset(flag,-1,sizeof(flag));
	memset(ss,0,sizeof(ss));
	scanf("%d",&n);
	for(int i=0;i<n;++i){
	  	cin>>aa[i].height>>aa[i].male>>aa[i].music>>aa[i].pe;
	}
	for(int i=0;i<n;++i){
		for(int j=0;j<n;++j){
			int x=abs(aa[j].height-aa[i].height);
			if(x<=40&&aa[j].male!=aa[i].male&&aa[j].music==aa[i].music&&aa[j].pe!=aa[i].pe){
				ss[i].push_back(j);
			}
		}
	}
	int sum=0;
	for(int i=0;i<n;++i){
	  memset(visted,0,sizeof(visted));
	  if(dfs(i))
		  sum++;
	}
	printf("%d\n",n-sum/2);
  }
  return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章