Pagini recente » Cod sursa (job #289049) | Cod sursa (job #2341421) | Cod sursa (job #1264019) | Cod sursa (job #1777498) | Cod sursa (job #190429)
Cod sursa(job #190429)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int NMAX=202,Inf=9999999;
vector<int> a[NMAX];
int n,c[NMAX][NMAX],r[NMAX][NMAX],dmin[NMAX],sol;
ifstream f("cc.in");
ofstream g("cc.out");
void citeste(){
int i,j;
f>>n;
for (i=1;i<=n;++i){
c[0][i]=c[i][0]=0;
r[0][i]=1;
r[i][0]=0;
a[0].push_back(i);
for (j=1;j<=n;++j){
f>>c[i][100+j];
c[100+j][i]=-c[i][100+j];
r[i][100+j]=1;
r[100+j][i]=0;
a[i].push_back(100+j);}
c[100+i][201]=0;
c[201][100+i]=0;
r[100+i][201]=1;
r[201][100+i]=0;
a[100+i].push_back(201);
}
}
int drum(){
queue<int> q;
int t[NMAX],aux,min;
bool u[NMAX];
vector<int>::iterator it;
memset(u,false,sizeof(u));
memset(dmin,Inf,sizeof(dmin));
memset(t,0,sizeof(t));
dmin[0]=0;
q.push(0);u[0]=true;
while (!q.empty()){
aux=q.front();
q.pop();u[aux]=false;
for (it=a[aux].begin();it!=a[aux].end();it++)
if (r[aux][*it]>0)
if (dmin[*it]>dmin[aux]+c[aux][*it]){
dmin[*it]=dmin[aux]+c[aux][*it];
t[*it]=aux;
if (!u[*it]){
q.push(*it);
u[*it]=true;}
}
}
if (!t[201]) return -1;
aux=201;
while (aux){
g<<aux<<' ';
r[t[aux]][aux]=0;
r[aux][t[aux]]=1;
a[aux].push_back(t[aux]);
aux=t[aux];}
g<<dmin[201]<<'\n';
return dmin[201];
}
void flux(){
int w,i,j;
sol=1;
do{
w=drum();
sol+=w;
}while (w>=0);
g<<sol;
}
int main(){
citeste();
flux();
return 0;
}