Pagini recente » Cod sursa (job #1714402) | Cod sursa (job #2068105) | Cod sursa (job #1182479) | Atasamentele paginii Clasament oni_2016_10-ziua2 | Cod sursa (job #2960925)
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#include<bitset>
using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");
const int NMAX = 103;
const int DMAX = 2 * NMAX;
const int P = 1e2;
const int INF = 1e9;
vector<int> vecini[DMAX];
int cost[DMAX][DMAX],cap[DMAX][DMAX],t[2 * NMAX],flow[DMAX][DMAX];
int n,sink,finished,ans,out;
bitset<DMAX> inq;
void bf()
{
vector<int> dp (DMAX,INF);
memset(t,0,sizeof(t));
dp[0] = 0;
queue<int> q;
inq.reset();
q.push(0);
while(!q.empty())
{
int v = q.front();
q.pop(); inq[v] = 0;
for(auto it : vecini[v])
{
if((cap[v][it] - flow[v][it]) == 0) continue;
if(dp[v] + cost[v][it] < dp[it])
{
t[it] = v;
dp[it] = dp[v] + cost[v][it];
if(!inq[it])
q.push(it);
}
}
}
if(dp[sink] == INF)
{
finished = 1;
return;
}
for(int c = sink; c != 0 ; c = t[c])
{
flow[t[c]][c] += 1;
flow[c][t[c]] -= 1;
}
ans += dp[sink];
}
void fmcm()
{
while(!finished)
bf();
fout << ans;
exit(0);
}
int main()
{
int n; fin >> n;
sink = 2 * NMAX - 1;
for(int i = 1; i <= n ; i++)
{
for(int s = 1; s <= n ; s++)
{
fin >> cost[i][s + P];
cap[i][s + P] = 1;
cap[s + P][sink] = 1;
cost[s + P][i] = -cost[i][s + P];
vecini[s + P].emplace_back(i);
vecini[i].emplace_back(s + P);
}
}
for(int i = 1; i <= n ; i++)
{
vecini[0].emplace_back(i);
cap[0][i] = 1;
vecini[i + P].emplace_back(sink);
vecini[i].emplace_back(0);
vecini[sink].emplace_back(i + P);
}
fmcm();
}