[bzoj4443][Scoi2015]小凸玩矩阵(二分答案+二分图最大匹配)
2016-07-20 21:04
501 查看
【题目链接】http://www.lydsy.com/JudgeOnline/problem.php?id=4443
【解题思路】二分答案转化为判定性问题,将数值小于等于二分值的节点拿去建二分图,跑一边最大匹配即可
【呆马】
【解题思路】二分答案转化为判定性问题,将数值小于等于二分值的节点拿去建二分图,跑一边最大匹配即可
【呆马】
#include<cstdio> #include<algorithm> #include<cmath> #include<cstdlib> #include<iostream> const int N=251; using namespace std; struct st{int to,next;} e[N*N]; int n,m,k,i,j,t,cnt,l,r,mid,ans,a ,b[N*N],fi ,f ; bool vis ; void add(int x,int y){e[++cnt].to=y; e[cnt].next=fi[x]; fi[x]=cnt;} bool find(int x) { for (int i=fi[x];i;i=e[i].next) if (!vis[e[i].to]) { int y=e[i].to; vis[y]=1; if (!f[y] || find(f[y])){f[y]=x; return 1;} } return 0; } bool check(int x) { int num=0; cnt=0; for (int i=1;i<=n;i++) fi[i]=0; for (int i=1;i<=m;i++) f[i]=0; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (a[i][j]<=x) add(i,j); for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) vis[j]=0; if (find(i)) num++; if (num==k) return 1; } return 0; } int main() { scanf("%d%d%d\n",&n,&m,&k); k=n-k+1; for (i=1;i<=n;i++,scanf("\n")) for (j=1;j<=m;j++) { scanf("%d",&a[i][j]); b[++t]=a[i][j]; } sort(b+1,b+t+1); t=unique(b+1,b+t+1)-(b+1); for (l=1,r=t;l<=r;) { mid=(l+r)>>1; if (check(b[mid])) ans=b[mid],r=mid-1; else l=mid+1; } printf("%d",ans); }
相关文章推荐
- 快速排序里的学问:从猜数字开始
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- Search Insert Position,Search for a Range,Pow(x, n),Sqrt(x)
- Find Minimum in Rotated Sorted Array II
- [LeetCode] Sqrt(x)
- [LeetCode] Pow(x, n)
- [LeetCode] Search Insert Position
- [LeetCode] Search for a Range
- [LeetCode] Search in Rotated Sorted Array
- BZOJ3275 Number (最小割)
- BZOJ2809——[Apio2012]dispatching
- BZOJ2809——[Apio2012]dispatching
- PAT 1057 Stack (30)
- int sqrt(int x)
- Pow(x, n)
- Find Minimum in Rotated Sorted Array
- Divide Two Integers
- 信息竞赛学习笔记:POJ3579中位数(二分)
- acm解题报告 HDU 2141 Can you find it?
- acm解题报告 HDU 2199 Can you solve this equation?