最大独立集问题,,这题难就难在建图上,,,这里是把相互产生矛盾的点连成一条边,,然后求最小覆盖即最大匹配从而得出最大独立集=p-最大匹配数从而转化为求增光路问题,,
代码:
#include<iostream> #include<string.h> #include<string> #include<vector> #define N 501 using 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; }