Pagini recente » Cod sursa (job #495282) | Cod sursa (job #1141908) | Cod sursa (job #1988744) | Cod sursa (job #3160500) | Cod sursa (job #16723)
Cod sursa(job #16723)
#include <string>
#include <cstdio>
#define maxn 128
#define oo 0x3f3f3f3f
int cap[maxn<<1][maxn<<1], cost[maxn<<1][maxn<<1];
int n, m, i, j, k, t, sursa, dest, v, d[maxn], tata[maxn], actual;
bool viz[maxn<<1];
void citire()
{
freopen("cc.in", "r", stdin);
scanf("%d\n", &n);
int i, j, p;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%d ", &p);
cap[i][j+n]=1;
cost[i][j+n]=p;
//cost[j+n][i]=-p;
}
sursa=0;
dest=2*n + 1;
for(i=1;i<=n;i++) cost[sursa][i]=cost[i][sursa]=0, cap[sursa][i]=1;
for(i=n+1;i<=n<<1;i++) cost[dest][i]=cost[i][dest]=0, cap[i][dest]=1;
}
void bellman()
{
int i, actual;
int d[256];
memset(d, oo, sizeof(d));
memset(tata, 0, sizeof(tata));
d[0]=0;
actual=1;
while(actual)
{
actual=0;
for(i=sursa;i<=dest;i++)
if(d[i]!=oo)
for(j=sursa;j<=dest;j++)
if(cap[i][j])
if(d[i]+cost[i][j]<d[j])
{
d[j]=d[i]+cost[i][j];
tata[j]=i;
actual=1;
}
}
}
void dijkstra()
{
int i, min, nod;
int d[maxn<<1];
bool viz[maxn<<1];
memset(viz, 0, sizeof(viz));
memset(d, oo, sizeof(d));
memset(tata, 0, sizeof(tata));
d[0]=0;
while(1)
{
min=oo;
nod=-1;
for(i=sursa;i<=dest;i++)
if(!viz[i] && min>d[i]) min=d[i], nod=i;
if(min==oo) return;
viz[nod]=1;
for(i=sursa;i<=dest;i++)
if(cap[nod][i])
if(d[i]>d[nod]+cost[nod][i])
{
d[i]=d[nod]+cost[nod][i];
tata[i]=nod;
}
}
}
void umple_sigur()
{
int i;
i=dest;
while(i)
{
j=tata[i];
cap[j][i]=0;
cap[i][j]=1;
i=j;
}
}
void umple()
{
bellman();
//dijkstra();
umple_sigur();
}
int gata()
{
int v=0, i;
for(i=n+1;i<=n<<1;i++) if(cap[i][dest]==0) v++;
return v==n;
}
void scrie()
{
t=0;
for(i=1;i<=n;i++)
{
k=0;
for(j=n+1;j<=n<<1;j++)
if(cap[i][j]==0 && cost[i][j]!=oo) k=j;
t+=cost[i][k];
}
freopen("cc.out", "w", stdout);
printf("%d\n", t);
/*
for(i=1;i<=n;i++)
{
k=0;
for(j=n+1;j<=n<<1;j++)
if(cap[i][j]==0 && cost[i][j]!=oo) k=j;
printf("%d ", k-n);
}
*/
}
int main()
{
citire();
do umple(); while(!gata());
scrie();
return 0;
}