Pagini recente » Cod sursa (job #2449682) | Cod sursa (job #1030494) | Cod sursa (job #530757) | Cod sursa (job #2640303) | Cod sursa (job #76312)
Cod sursa(job #76312)
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;
int Q[maxn], p=0, q=0;
Q[0]=source;
int nrqueue=1;
int u,poz, aux;
while(nrqueue)
{
poz=(p+0%nrqueue)&0xff;
i=Q[poz];//Q[p];
aux=Q[poz];Q[poz]=Q[p];Q[p]=aux;
++p;p&=0xff;
--nrqueue;
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[(++q)&0xff]=j;
q&=0xff;
++nrqueue;
}
}
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;
}