hdu 2768,hdu 4160 二分图的最大匹配
hdu 2768,两个投票者矛盾的话就连一条边,总数减去最大匹配数就是要求的答案
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<iostream>
using namespace std;
bool vis[501];
int match[501];
vector<int> g[501];
string a[505],b[505];
bool dfs(int u)
{
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(vis[v]) continue;
vis[v]=true;
if(match[v]==-1||dfs(match[v]))
{
match[v]=u;
return true;
}
}
return false;
}
int main()
{
int t,i,j,c,d,n;
scanf("%d",&t);
while(t--)
{
for(i=0;i<=500;i++) g[i].clear();
scanf("%d%d%d",&c,&d,&n);
for(i=1;i<=n;i++)
{
cin>>a[i]>>b[i];
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i]==b[j]||a[j]==b[i])
{
g[i].push_back(j);
// printf("%d %d\n",i,j);
}
}
}
memset(match,-1,sizeof(match));
int ans=0;
for(i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
ans++;
}
printf("%d\n",n-ans/2);
}
return 0;
hdu 4160
一个doll能放进另一个doll就在二分图中连一条边,然后求最大匹配,因为匹配一个,所需的总数就少一个
View Code
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<iostream>
using namespace std;
bool vis[501];
int match[501];
vector<int> g[501];
struct node{
int x,y,z;
}box[505];
bool ok(node a ,node b)
{
return a.x<b.x&&a.y<b.y&&a.z<b.z;
}
bool dfs(int u)
{
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(vis[v]) continue;
vis[v]=true;
if(match[v]==-1||dfs(match[v]))
{
match[v]=u;
return true;
}
}
return false;
}
int main()
{
int n,i,j;
while(scanf("%d",&n),n)
{
for(i=0;i<=500;i++) g[i].clear();
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&box[i].x,&box[i].y,&box[i].z);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(ok(box[i],box[j]))
{
g[i].push_back(j);
}
}
}
memset(match,-1,sizeof(match));
int ans=0;
for(i=1;i<=n;i++)
{
memset(vis,false,sizeof(vis));
if(dfs(i))
ans++;
}
printf("%d\n",n-ans);
}
return 0;
}