Pagini recente » Cod sursa (job #1427529) | Cod sursa (job #56014) | Cod sursa (job #1217031) | Cod sursa (job #291807) | Cod sursa (job #2386382)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream si("cc.in");
ofstream so("cc.out");
int c[205][205], n, parinte[205], dist[205], cost[205][205], sol;
vector<pair<int,int> > graf[205];
bool dij() {
int nod;
queue<int> Q;
memset(parinte,0,sizeof(parinte));
memset(dist,0x3f3f3f3f,sizeof(dist));
Q.push(0);
dist[0]=0;
while(!Q.empty()) {
nod=Q.front();
Q.pop();
for(auto vec:graf[nod]) {
if(c[nod][vec.first]&&dist[vec.first]>dist[nod]+vec.second) {
dist[vec.first]=dist[nod]+vec.second;
Q.push(vec.first);
parinte[vec.first]=nod;
}
}
}
if(dist[2*n+1]==0x3f3f3f3f)
return false;
for(int i=2*n+1; i!=0; i=parinte[i]) {
c[parinte[i]][i]--;
c[i][parinte[i]]++;
sol=sol+cost[parinte[i]][i];
}
return true;
}
int main()
{
si>>n;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
int x;
si>>x;
graf[i].push_back(make_pair(j+n,x));
graf[j+n].push_back(make_pair(i,-x));
c[i][j+n]=1;
cost[i][j+n]=x;
cost[j+n][i]=-x;
}
}
for(int i=1; i<=n; i++) {
graf[0].push_back(make_pair(i,0));
c[0][i]=1;
}
for(int i=n+1; i<=2*n; i++) {
graf[i].push_back(make_pair(2*n+1,0));
c[i][2*n+1]=1;
}
while(dij());
so<<sol;
return 0;
}