Pagini recente » Cod sursa (job #2916546) | Cod sursa (job #1429744) | Cod sursa (job #571526) | Cod sursa (job #637082) | Cod sursa (job #571218)
Cod sursa(job #571218)
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#define MAX 205
#define INF 0x3f3f3f
#define SHIFT 101
using namespace std;
int N,C[MAX][MAX],F[MAX][MAX],T[MAX],dist[MAX],in[MAX];
vector< pair<int,int> > G[MAX];
queue<int> Q;
void read()
{
ifstream f("cc.in");
f>>N;
int i,j,x;
for(i=1;i<=N;++i)
for(j=1;j<=N;++j)
{
f>>x;
G[i].push_back(make_pair(SHIFT+j, x));
G[SHIFT+j].push_back(make_pair(i, -x));
C[i][SHIFT+j] = 1;
}
f.close();
for(i=1;i<=N;++i)
{
C[0][i] = 1;
G[0].push_back(make_pair(i,0));
G[i].push_back(make_pair(0,0));
C[SHIFT+i][SHIFT+N+1] = 1;
G[SHIFT+i].push_back(make_pair(SHIFT+N+1, 0));
G[SHIFT+N+1].push_back(make_pair(SHIFT+i, 0));
}
}
int bf()
{
memset(dist,INF,MAX);
//for(int i=1;i<=SHIFT+N+1;++i)
// dist[i] = INF;
int nod;
Q.push(0);
dist[0] = 0;
in[0] = 1;
vector< pair<int,int> >::iterator it;
int vec,c;
while(!Q.empty())
{
nod = Q.front();
Q.pop();
in[nod] = 0;
if(nod == SHIFT+N+1)continue;
for(it = G[nod].begin();it!=G[nod].end();++it)
{
vec = it->first;
c = it->second;
if(dist[nod] + c < dist[vec] && C[nod][vec] > F[nod][vec])
{
dist[vec] = dist[nod] + c;
T[vec] = nod;
if(!in[vec])
{
in[vec] = 1;
Q.push(vec);
}
}
}
}
if(dist[SHIFT+N+1] != INF)return 1;
return 0;
}
int main()
{
read();
int r,cost=0,i;
while(bf())
{
i = SHIFT+N+1;
r = INF;
while(i)
{
r = min(r,C[T[i]][i] - F[T[i]][i]);
i = T[i];
}
i = SHIFT+N+1;
while(i)
{
F[T[i]][i] += r;
F[i][T[i]] -= r;
i = T[i];
}
cost += r*dist[SHIFT+N+1];
}
ofstream g("cc.out");
g<<cost<<"\n";
g.close();
return 0;
}