Pagini recente » Cod sursa (job #1909257) | Cod sursa (job #1777763) | Cod sursa (job #2393842) | Cod sursa (job #2590366) | Cod sursa (job #76304)
Cod sursa(job #76304)
using namespace std;
#include <cstdio>
#include <string>
#include <queue>
#include <deque>
#include <cstdlib>
#include <ctime>
#include <vector>
#define oo 0x3f3f3f3f
#define maxn 256
int cap[maxn][maxn], cost[maxn][maxn], val[maxn];
int n, source, sink;
int d[maxn],t[maxn];
void read()
{
freopen("cc.in","r",stdin);
scanf("%d\n", &n);
int i, j, w;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
{
scanf("%d ", &w);
cost[i][j+n]=w;
cost[j+n][i]=-w;
cap[i][j+n]=1;
}
source=0, sink=n+n+1;
for(i=1;i<=n;++i) cost[source][i]=0, cost[i][source]=0, cap[source][i]=1;
for(i=n+1;i<sink;++i) cost[i][sink]=0, cost[sink][i]=0, cap[i][sink]=1;
}
struct cmp{
bool operator()(const int &a, const int &b)const
{
if(d[a]>d[b])return 1;
return 0;
}
};
int bellman2()
{
int i,j;
memset(d, oo, sizeof(d));
memset(t, 0, sizeof(t));
d[source]=0;
int ok=1;
int *pcap;
priority_queue<int, vector<int>, cmp>Q;
Q.push(source);
int u, p, aux;
while(!Q.empty())
{
// p=rand()%Q.size();
i=Q.top();//Q[p];
//aux=Q[p];Q[p]=Q[0];Q[0]=aux;
Q.pop();
for(j=source;j<=sink;++j)
if(cap[i][j])
if(d[i]+cost[i][j]<d[j])
{
d[j]=d[i]+cost[i][j];
t[j]=i;
Q.push(j);
}
}
if(d[sink]==oo) return 0;
for(i=sink;i!=source;i=t[i])
cap[t[i]][i]-=1,
cap[i][t[i]]+=1;
return 1;
}
void maxflow()
{
int i, j;
while(bellman2());//printf("da\n");
int sol=0;
for(i=1;i<=n;++i)
for(j=n+1;j<sink;++j)
if(!cap[i][j])sol+=cost[i][j];
freopen("cc.out","w",stdout);
printf("%d\n", sol);
}
int main()
{
srand(time(0));
read();
//printf("%d\n", n);
maxflow();
return 0;
}