LA 3353 Optimal Bus Route Design

来源:互联网 发布:单片机仿真软件百度云 编辑:程序博客网 时间:2024/05/16 11:26
#include<cstdio>#include<cstring>#include<algorithm>#define INF 0x3f3f3f3fusing 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);}}

原创粉丝点击