【HDU 1150】Machine Schedule(二分图匹配)
机器的不同模式为点,对于每个job,建两条边 A机器需要的模式<->B机器需要的模式。
问题转化为最小点覆盖,然后用二分图的最小点覆盖==最大匹配,用匈牙利算法解。
#include <cstdio> #include <cstring> const int N=105<<1; const int M=1001<<1; struct edge{ int to,next; }e[M]; int head[N],tot; void add(int u,int v){ e[tot].to=v;e[tot].next=head[u];head[u]=tot++; } void init(){ tot=0; memset(head,-1,sizeof head); } int n,vis[N],link[N]; int find(int u) { for(int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(!vis[v]){ vis[v]=1; if(!link[v]||find(link[v])){ link[v]=u; return 1; } } } return 0; } int solve(){ memset(link,0,sizeof link); int ans=0; for(int i=1;i<=n;i++){ memset(vis,0,sizeof vis); if(find(i))ans++; } return ans; } int main(){ int k,m,u,v; while(scanf("%d",&n),n){ init(); scanf("%d%d",&m,&k); while(k--){ scanf("%d%d%d",&m,&u,&v); add(u,v+n); add(v+n,u); } printf("%d\n",solve()); } }
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆