Pagini recente » Cod sursa (job #2573226) | Cod sursa (job #1103269) | Cod sursa (job #1302727) | Cod sursa (job #2094452) | Cod sursa (job #791575)
Cod sursa(job #791575)
#include <fstream>
#include <vector>
#include <queue>
#define NMAx 210
#define oo (1<<30)
#define pb push_back
using namespace std;
queue <int> Q;
vector <int> G[NMAx];
int N,S,D,Sol,Dist[NMAx],T[NMAx],Cost[NMAx][NMAx];
bool Flux[NMAx][NMAx],inQ[NMAx];
bool BF() {
int i,Nod,Vecin;
for(i=S;i<=D;Dist[i++]=oo);
Q.push(S);
inQ[S]=0;
Dist[S]=0;
while(!Q.empty()) {
Nod=Q.front();
Q.pop();
inQ[Nod]=0;
for(i=0;i<G[Nod].size();i++) {
Vecin=G[Nod][i];
if(Flux[Nod][Vecin]&&Dist[Vecin]>Dist[Nod]+Cost[Nod][Vecin]) {
Dist[Vecin]=Dist[Nod]+Cost[Nod][Vecin];
T[Vecin]=Nod;
if(!inQ[Vecin]) {
Q.push(Vecin);
inQ[Vecin]=1;
}
}
}
}
return (Dist[D]!=oo);
}
void BuildGraph() {
S=0;
D=2*N+1;
for(int i=1;i<=N;i++) {
G[S].pb(i);
Flux[S][i]=1;
G[i+N].pb(D);
Flux[i+N][D]=1;
}
}
void Solve() {
int i;
BuildGraph();
while(BF()) {
for(i=D;i;i=T[i]) {
Flux[T[i]][i]=0;
Flux[i][T[i]]=1;
}
Sol+=Dist[D];
}
}
void Citire() {
int i,j;
ifstream in("cc.in");
in>>N;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++) {
G[i].pb(j+N);
G[j+N].pb(i);
in>>Cost[i][j+N];
Cost[j+N][i]=-Cost[i][j+N];
Flux[i][j+N]=1;
}
in.close();
}
void Afis() {
ofstream out("cc.out");
out<<Sol<<'\n';
out.close();
}
int main() {
Citire();
Solve();
Afis();
return 0;
}