2011 Multi-University Training Contest 1 - Host by HNU&&Cat VS Dog

来源:互联网 发布:java多线程查询数据库 编辑:程序博客网 时间:2024/06/05 08:59

 最大独立集问题,,这题难就难在建图上,,,这里是把相互产生矛盾的点连成一条边,,然后求最小覆盖即最大匹配从而得出最大独立集=p-最大匹配数从而转化为求增光路问题,,

代码:

#include<iostream>#include<string.h>#include<string>#include<vector>#define N 501using namespace std;struct Node{ string a,b;}t[N];int match[N];bool visit[N];vector<int> s[N];bool dfs(int x){ for(int i=0;i<s[x].size();++i)  if(!visit[s[x][i]])  {    visit[s[x][i]]=1;      if(match[s[x][i]]==-1||dfs(match[s[x][i]]))      {match[s[x][i]]=x;       return true;      }  }  return false;}int main() { int n,m,p;   while(cin>>n>>m>>p)   {   for(int i=1;i<=p;++i)        cin>>t[i].a>>t[i].b;        for(int i=0;i<=p;++i)            s[i].clear();        memset(match,-1,sizeof(match));        for(int i=1;i<p;++i)            for(int j=i+1;j<=p;++j)                if(t[i].a==t[j].b||t[i].b==t[j].a)                { s[i].push_back(j);                  s[j].push_back(i);                }           int num=0;           for(int i=1;i<=p;++i)           { memset(visit,0,sizeof(visit));             if(dfs(i)) num++;           }           cout<<p-num/2<<endl;   }return 0;    }