Pagini recente » Cod sursa (job #2320056) | Cod sursa (job #283685) | Cod sursa (job #2578464) | Cod sursa (job #1784849) | Cod sursa (job #867594)
Cod sursa(job #867594)
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
#define MAX 205
#define INF 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define PII pair<int, int>
using namespace std;
int N, rez, S, D;
int dist[MAX], dad[MAX];
bool inQueue[MAX];
PII cf[MAX][MAX];
vector<PII> V[MAX];
queue<int> Q;
int BellmanFord()
{
memset(dist, INF, sizeof(dist));
memset(inQueue, 0, sizeof(inQueue));
memset(dad, 0, sizeof(dad));
dist[S] = 0; Q.push(0); inQueue[S] = true;
while(!Q.empty())
{
int nod = Q.front(); Q.pop(); inQueue[nod] = false;
for(size_t i = 0; i < V[nod].size(); i++)
{
int dest = V[nod][i].f, cost = V[nod][i].s;
if(cf[nod][dest].f != cf[nod][dest].s && dist[dest] > dist[nod] + cost)
{
dist[dest] = dist[nod] + cost;
dad[dest] = nod;
if(!inQueue[dest])
inQueue[dest] = true, Q.push(dest);
}
}
}
if(dist[D] != INF)
{
int nod = D;
while(nod)
{
cf[dad[nod]][nod].s++;
cf[nod][dad[nod]].s--;
nod = dad[nod];
}
return dist[D];
}
return 0;
}
int cuplaj()
{
int X = 0;
for(int i = 1; i <= N; i++)
X += BellmanFord();
return X;
}
int main()
{
ifstream in("cc.in");
in>>N;
for(int i = 1; i <= N; i++)
for(int j = 1, C, dest; j <= N; j++)
{
in>>C;
dest = j + N;
V[i].pb(mp(dest, C)); V[dest].pb(mp(i, -C));
cf[i][dest] = mp(1, 0); cf[dest][i] = mp(0, 0);
}
S = 0, D = 2 * N + 1;
for(int i = 1; i <= N; i++)
{
V[S].pb(mp(i, 0)); V[i].pb(mp(S, 0));
cf[S][i] = mp(1, 0); cf[i][S] = mp(0, 0);
}
for(int i = N + 1; i <= 2 * N; i++)
{
V[i].pb(mp(D, 0)); V[D].pb(mp(i, 0));
cf[i][D] = mp(1, 0); cf[D][i] = mp(0, 0);
}
rez = cuplaj();
ofstream out("cc.out"); out<<rez<<"\n"; out.close();
return 0;
}