#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int lx[260],ly[260],mat[260],slack[260],vx[260],vy[260],s[260][260],n;
int match(int u){
vx[u]=1;
for(int i=1;i<=n;i++){
if(!vy[i]){
int t=lx[u]+ly[i]-s[u][i];
if(t == 0){
vy[i]=1;
if(mat[i] == -1 || match(mat[i])){
mat[i]=u;
return 1;
}
}else slack[i]=min(slack[i],t);
}
}
return 0;
}
int KM(){
memset(mat,-1,sizeof(mat));
memset(ly,0,sizeof(ly));
for(int i=1;i<=n;i++){
lx[i]=-INF;
for(int j=1;j<=n;j++)
if(s[i][j]) lx[i]=max(lx[i],s[i][j]);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
slack[j]=INF;
while(1){
memset(vx,0,sizeof(vx));
memset(vy,0,sizeof(vy));
if(match(i)) break;
int d=INF;
for(int j=1;j<=n;j++)
if(!vy[j]) d=min(d,slack[j]);
for(int j=1;j<=n;j++){
if(vx[j]) lx[j]-=d;
if(vy[j]) ly[j]+=d;
}
}
}
int ans=0,cnt=0;
for(int i=1;i<=n;i++){
if(mat[i]!=-1 && s[mat[i]][i] != -INF){
ans+=s[mat[i]][i];
cnt++;
}
}
if(cnt!=n) return -1;
return -ans;
}
int main(){
while(scanf("%d",&n) == 1 && n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
s[i][j]=-INF;
}
for(int i=1;i<=n;i++){
int u,v;
while(scanf("%d",&u) && u){
scanf("%d",&v);
if(-v>s[i][u])
s[i][u]=-v;
}
}
int res=KM();
if(res==-1) printf("N\n");
else printf("%d\n",res);
}
}
LA 3353 Optimal Bus Route Design
最新推荐文章于 2022-12-19 14:26:58 发布