题目求的刚好是和km算法求的东西相反,所以直接用km算法求就可以。。km算法的可行顶点具体意义见百度
然后还卡时间,要用bfs写n^3才能过,反正不造这个板子想表达什么,能用就用,不能用就算了
/**
* ┏┓ ┏┓
* ┏┛┗━━━━━━━┛┗━━━┓
* ┃ ┃
* ┃ ━ ┃
* ┃ > < ┃
* ┃ ┃
* ┃... ⌒ ... ┃
* ┃ ┃
* ┗━┓ ┏━┛
* ┃ ┃ Code is far away from bug with the animal protecting
* ┃ ┃ 神兽保佑,代码无bug
* ┃ ┃
* ┃ ┃
* ┃ ┃
* ┃ ┃
* ┃ ┗━━━┓
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━━━━━━━━┳┓┏┛
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<bitset>
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,l,r) for(int i=l;i>=r;i--)
#define link(x) for(edge *j=h[x];j;j=j->next)
#define mem(a) memset(a,0,sizeof(a))
#define ll long long
#define eps 1e-8
#define succ(x) (1LL<<(x))
#define lowbit(x) (x&(-x))
#define sqr(x) ((x)*(x))
#define mid (x+y>>1)
#define NM 100005
#define nm 200005
#define N 40005
#define M(x,y) x=max(x,y)
const double pi=acos(-1);
const int inf=1e9;
using namespace std;
ll read(){
ll x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f*x;
}
struct edge{int t,v;edge*next,*rev;}e[nm],*h[NM],*o=e;
void add(int x,int y,int v){o->t=y;o->v=v;o->next=h[x];h[x]=o++;}
int n,b[NM],match[NM],lx[NM],ly[NM],pre[NM],ca;
bool v[NM];
ll ans;
void bfs(int k){
int x,y=0,t=0,s;
mem(pre);
inc(i,1,n)b[i]=inf;
match[y]=k;
do{
x=match[y];s=inf;v[y]=true;
link(x)if(!v[j->t]){
if(b[j->t]>lx[x]+ly[j->t]-j->v)b[j->t]=lx[x]+ly[j->t]-j->v,pre[j->t]=y;
if(s>b[j->t])s=b[j->t],t=j->t;
}
inc(i,0,n)if(v[i])lx[match[i]]-=s,ly[i]+=s;else b[i]-=s;
y=t;
}while(match[y]);
for(;y;y=pre[y])match[y]=match[pre[y]];
}
int main(){
//freopen("data.in","r",stdin);
int _=read();while(_--){
ans=0;mem(match);mem(e);mem(h);o=e;mem(lx);mem(ly);
n=read();inc(i,1,n)inc(j,1,n)add(i,j,-read());
inc(i,1,n)mem(v),bfs(i);
inc(i,1,n)if(match[i])ans+=ly[i]+lx[match[i]];
//inc(i,1,n)printf("%d ",lx[i]);putchar('\n');
//inc(i,1,n)printf("%d ",ly[i]);putchar('\n');
printf("Case #%d: %lld\n",++ca,-ans);
}
return 0;
}
整数规划Time Limit: 5500/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 469 Accepted Submission(s): 164 Problem Description 度度熊有一个可能是整数规划的问题:
Input 第一行包含一个整数 T,表示有 T 组测试数据。
Output 对于每组测试数据,输出一行信息 "Case #x: y"(不含引号),其中 x 表示这是第 x 组测试数据,y 表示目标函数的最大值,行末不要有多余空格。
Sample Input 2 1 0 2 1 2 3 4
Sample Output Case #1: 0 Case #2: 5
Source
Recommend chendu | We have carefully selected several similar problems for you: 6408 6407 6406 6405 6404
|