HDU 2236 无题II(二分匹配模板题)

无题II

Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1635    Accepted Submission(s): 751

Problem Description
这是一个简单的游戏,在一个n*n的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小。
 
Input
输入一个整数T表示T组数据。
对于每组数据第一行输入一个正整数n(1<=n<=100)表示矩阵的大小。
接着输入n行,每行n个数x(0<=x<=100)。
 
Output
对于每组数据输出一个数表示最小差值。
 
Sample Input
1
4
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
 
Sample Output
3
 
二分来遍历所有可能的最小差值,二分匹配就是模板题
 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 const int N = 110;  
 5 const int inf = 0x3f3f3f3f;  
 6 int num[N],mapp[N][N];
 7 int p,mid,n;
 8 bool vis[N],flag;
 9 bool dfs(int v){
10     for(int i=0;i<n;i++){
11         if(mapp[v][i]>=p&&mapp[v][i]<=p+mid&&(!vis[i])){
12             vis[i]=true;
13             if(num[i]==-1||dfs(num[i])){
14                 num[i]=v;
15                 return true;
16             }
17         }
18     }
19     return false;
20 } 
21 bool solve(){
22     memset(num,-1,sizeof(num));
23     for(int i=0;i<n;i++){
24         memset(vis,0,sizeof(vis));
25         if(!dfs(i)){
26             return false;
27         }
28     }
29     return true;
30 }
31 int main(){
32     cin.sync_with_stdio(false);
33     int T;
34     cin>>T;
35     while(T--){
36         cin>>n;
37         int vmax=-inf,vmin=inf;
38         for(int i=0;i<n;i++){
39             for(int j=0;j<n;j++){
40                 cin>>mapp[i][j];
41                 vmax=max(vmax,mapp[i][j]);
42                 vmin=min(vmin,mapp[i][j]);
43             }
44         }
45         int r=vmax-vmin,l=0,res;
46         while(l<=r){
47             mid=(l+r)>>1;
48             flag=false;
49             for(p=vmin;p+mid<=vmax;p++){
50                 if(solve()){
51                     flag=true;
52                     break;
53                 }
54             }
55             if(flag){
56                 res=mid;
57                 r=mid-1;
58             }
59             else{
60                 l=mid+1;
61             }
62         }
63         cout<<res<<endl;
64     }
65     return 0;
66 }

 

2017-02-28 22:06:36
posted @ 2017-02-28 22:08  ガ落涙『不變』  阅读(134)  评论(0编辑  收藏  举报