LightOJ

来源:互联网 发布:led显示屏输入软件 编辑:程序博客网 时间:2024/06/14 22:08

原题地址:点击打开链接

#include<stdio.h>#include<string.h>#include<vector>#include<queue> #define INF 1<<31-1#define min(x,y)(x<y?x:y)using namespace std;struct Edge{int to;int cap;int rev;int cost;};vector<Edge>g[110];int prev[110];int pree[110];void add_edge(int from,int to,int cap,int cost){g[from].push_back((Edge){to,cap,g[to].size(),cost});g[to].push_back((Edge){from,0,g[from].size()-1,-cost});}int dis[110];int min_cost_flow(int s,int t,int f)  {      int u,i,v,d,res=0;      while(f>0)      {          bool update=true;          for(i=1;i<=t;i++)              dis[i]=-INF;              dis[s]=0;          while(update)          {              update=false;              for(u=s;u<=t;u++)              {                  if(dis[u]==-INF)                      continue;                  for(i=0;i<g[u].size();i++)                  {                      Edge &e=g[u][i];                      if(e.cap>0&&dis[e.to]<dis[u]+e.cost)                      {                          dis[e.to]=dis[u]+e.cost;                          prev[e.to]=u;                          pree[e.to]=i;                          update=true;                      }                  }              }          }          if(dis[t]==-INF)              break;          d=INF;          for(u=t;u!=s;u=prev[u])          {              Edge e=g[prev[u]][pree[u]];              d=min(e.cap,d);           }                for(u=t;u!=s;u=prev[u])          {              Edge &e=g[prev[u]][pree[u]];              e.cap-=d;              g[e.to][e.rev].cap+=d;          }          res+=dis[t];          f-=d;      }      return res;  }  int main(){int c,n,i,j,cost,s,t,k=0;scanf("%d",&c);while(c--){scanf("%d",&n);s=0;t=n*2+1;for(i=s;i<=t;i++)g[i].clear();for(i=1;i<=n;i++)for(j=1;j<=n;j++){scanf("%d",&cost);add_edge(i,j+n,1,cost);}for(i=1;i<=n;i++){add_edge(s,i,1,0);add_edge(i+n,t,1,0);}int res=min_cost_flow(s,t,n);printf("Case %d: %d\n",++k,res);}return 0;} /*224 33 131 4 55 7 65 8 8*/


0 0