标签:default 黑白 二分图 等于 find size 决定 输入 label
★☆ 输入文件:qmatrix.in
输出文件:qmatrix.out
简单对比
时间限制:1 s
内存限制:128 MB
对于100%的数据,N≤ 200
【题解】
这道题乍一看不像能用匈牙利算法
但其实我们仔细观察一下就能发现,我们可以把为1的点的横坐标与纵坐标加n连起来
然后看它是否有最大匹配等于n
就能知道可否完成
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct edge{ int to,next; }e[40005]; int T,n,x,ans,ecnt,head[205],point[405]; bool used[4005]; void add(int a,int b) { ecnt++; e[ecnt]=(edge){b+200,head[a]}; head[a]=ecnt; } bool find(int a) { for(int i=head[a];i;i=e[i].next) { if(!used[e[i].to]) { used[e[i].to]=1; if(!point[e[i].to]||find(point[e[i].to])) { point[e[i].to]=a; return true; } } } return false; } int main() { scanf("%d",&T); while(T) { memset(e,0,sizeof(e)); memset(head,0,sizeof(head)); memset(point,0,sizeof(point)); ecnt=0; T--; scanf("%d",&n); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) { scanf("%d",&x); if(x)add(i,j); } ans=0; for(int i=1;i<=n;++i) { memset(used,0,sizeof(used)); if(find(i))ans++; } if(ans==n)printf("Yes\n"); else printf("No\n"); } }
标签:default 黑白 二分图 等于 find size 决定 输入 label
原文地址:http://www.cnblogs.com/rir1715/p/6869136.html