无题II
Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 214 Accepted Submission(s): 102
对于每组数据第一行输入一个正整数n(1<=n<=100)表示矩阵的大小。
接着输入n行,每行n个数x(0<=x<=100)。
1 4 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4
3
Statistic | Submit | Discuss | Back
枚举差值+最小点集覆盖
#include<stdio.h>
#include<string.h>
int a[101][101];
bool map[101][101],usedif[101];
int link[101];
int maxn,minn,fir,last,n;
bool can(int t)
{
for(int i=0;i<n;i++)
if(usedif[i]==false&&map[t][i]==true)
{
usedif[i]=true;
if(link[i]==-1||can(link[i]))
{
link[i]=t;
return true;
}
}
return false;
}
bool MaxMatch()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(a[i][j]>=fir&&a[i][j]<=last) map[i][j]=true;
else map[i][j]=false;
memset(link,-1,sizeof(link));
for(int i=0;i<n;i++)
{
memset(usedif,false,sizeof(usedif));
if(!can(i)) return false;
}
return true;
}
int solve()
{
fir=minn;
last=maxn;
int min=1<<25-1;
while(fir>=0&&fir<=last)
{
if(MaxMatch())
{
if(min>last-fir) min=last-fir;
fir++;
}
else
{
last--;
fir--;
}
}
//for(int i=0;i<n;i++) printf("%d/n",link[i]);
return min;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
maxn=-1,minn=1<<25-1;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]>maxn) maxn=a[i][j];
if(a[i][j]<minn) minn=a[i][j];
}
printf("%d/n",solve());
}
return 0;
}