Pagini recente » Cod sursa (job #1455067) | Cod sursa (job #1362479) | Cod sursa (job #2040388) | Cod sursa (job #3193417) | Cod sursa (job #1766614)
#include <bits/stdc++.h>
#define maxN 205
#define INF (1<<30)
using namespace std;
queue<int> Que;
int seen[maxN];
vector<int> v[maxN];
int n,m,i,j,x,y,z,dist[maxN],t[maxN];
int cap[maxN][maxN],cost[maxN][maxN];
int nod,mincost,source,sink;
bool bellmanford()
{
memset(seen,false,sizeof(seen));
for(i=0;i<=2*n+1;i++)
dist[i]=INF;
dist[source]=0;
Que.push(source);
seen[source]=true;
while(!Que.empty())
{
int nod=Que.front();
Que.pop();
seen[nod]=0;
for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
if(cap[nod][*it] && dist[nod]+cost[nod][*it]<dist[*it])
{
dist[*it]=dist[nod]+cost[nod][*it];
t[*it]=nod;
if(!seen[*it])
seen[*it]=true,
Que.push(*it);
}
}
return !(dist[sink]==INF);
}
int main()
{
freopen("cc.in","r",stdin);
freopen("cc.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&cost[i][j+n]),
cost[j+n][i]=-cost[i][j+n];
source=0,sink=2*n+1;
for(i=1;i<=n;i++)
v[source].push_back(i),
v[i].push_back(source),
cap[source][i]=1;
for(i=n+1;i<=2*n;i++)
v[i].push_back(sink),
v[sink].push_back(i),
cap[i][sink]=1;
for(i=1;i<=n;i++)
for(j=n+1;j<=2*n;j++)
v[i].push_back(j),
v[j].push_back(i),
cap[i][j]=1;
while(bellmanford()==true)
{
mincost+=dist[sink];
for(nod=sink;nod!=source;nod=t[nod])
cap[t[nod]][nod]--,
cap[nod][t[nod]]++;
}
printf("%d",mincost);
return 0;
}