Pagini recente » Cod sursa (job #2698388) | Cod sursa (job #2773299) | Cod sursa (job #1092315) | Cod sursa (job #3288310) | Cod sursa (job #3259283)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream f("cc.in");
ofstream g("cc.out");
int cap[800][800],cost[800][800],indice[800][800],h[800],dist[800],parent[800],mincost;
bool inque[800];
int n,m,e,s,d,operatii;
vector<int> v[800];
void bellmanford()
{
queue<int> q;
memset(h,127,sizeof(int)*(n+m+5));
q.push(s);
h[s]=0;
while(!q.empty())
{
int x=q.front();
q.pop();
inque[x]=0;
for(auto i:v[x])
if(cap[x][i]&&h[i]>h[x]+cost[x][i])
{
h[i]=h[x]+cost[x][i];
if(!inque[i])
{
q.push(i);
inque[i]=1;
}
}
}
}
bool dijkstra()
{
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
int realdist[800];
memset(dist,127,sizeof(int)*(n+m+5));
pq.push({0,s});
dist[s]=realdist[s]=0;
while(!pq.empty())
{
int x=pq.top().second, y=pq.top().first;
pq.pop();
if(dist[x]!=y) continue;
for(auto i:v[x])
if(cap[x][i]&&y+cost[x][i]+h[x]-h[i]<dist[i])
{
pq.push({y+cost[x][i]+h[x]-h[i],i});
dist[i]=y+cost[x][i]+h[x]-h[i], realdist[i]=realdist[x]+cost[x][i];
parent[i]=x;
}
}
memcpy(h,realdist,sizeof h);
if(dist[d]!=dist[0]) return true;
return false;
}
int main()
{
f>>n;
m=n, e=n*n;
int ind=0;
for(int i=1;i<=e;i++)
{
int a,b,d;
f>>d;
a=i%n+n*(i%n==0), b=i/n+(i%n!=0);
b+=n;
cap[a][b]=1, cost[a][b]=d, cost[b][a]=-d, indice[b][a]=++ind;
v[a].push_back(b);
v[b].push_back(a);
}
s=n+m+1, d=n+m+2;
for(int i=1;i<=n;i++)
{
v[s].push_back(i);
//v[i].push_back(s);
cap[s][i]=1;
}
for(int i=n+1;i<=n+m;i++)
{
v[i].push_back(d);
//v[d].push_back(i);
cap[i][d]=1;
}
bellmanford();
int cnt=0;
while(dijkstra())
{
int node=d, tsoc=0;
node=d;
while(parent[node])
{
cap[parent[node]][node]-=1, cap[node][parent[node]]+=1;
tsoc+=cost[parent[node]][node];
node=parent[node];
}
mincost+=tsoc, cnt++;
}
g<<mincost;
return 0;
}