Pagini recente » Cod sursa (job #341976) | Cod sursa (job #538270) | Cod sursa (job #3249296) | Sopterean Adrian | Cod sursa (job #3186077)
#include <fstream>
#include <queue>
using namespace std;
int N,cost[202][202],cap[202][202],parent[202],dist[202],flow,mincost;
ifstream f ("cc.in");
ofstream g ("cc.out");
void bfs()
{
for(int i=1;i<=2*N+1;i++)
{
parent[i]=-1;
dist[i]=1e9;
}
dist[0]=0;
parent[0]=-1;
deque<int> q;
q.push_back(0);
while(!q.empty())
{
int k=q.front();
q.pop_front();
if(k<=N && k>=1)
{
for(int i=N+1;i<=2*N;i++)
if(cap[k][i]>0 && dist[i]>dist[k]+cost[k][i])
{
parent[i]=k;
dist[i]=dist[k]+cost[k][i];
q.push_back(i);
}
}
else if(k<=2*N)
{
for(int i=1;i<=N;i++)
if(cap[k][i]>0 && dist[i]>dist[k]+cost[k][i])
{
parent[i]=k;
dist[i]=dist[k]+cost[k][i];
q.push_back(i);
}
if(k!=0)
{
int i=2*N+1;
if(cap[k][i]>0 && dist[i]>dist[k]+cost[k][i])
{
parent[i]=k;
dist[i]=dist[k]+cost[k][i];
q.push_back(i);
}
}
}
}
}
int ford()
{
mincost=0;
while(dist[2*N+1]<1e9)
{
bfs();
if(dist[2*N+1]==1e9)
break;
int poz=2*N+1;
while(poz)
{
cap[parent[poz]][poz]-=1;
cap[poz][parent[poz]]+=1;
mincost+=cost[parent[poz]][poz];
poz=parent[poz];
}
}
return mincost;
}
int main()
{
f>>N;
for(int i=1;i<=N;i++)
for(int j=N+1;j<=2*N;j++)
{
f>>cost[i][j];
cost[j][i]=-cost[i][j];
cap[i][j]=1;
}
for(int i=1;i<=N;i++)
{
cap[0][i]=1;
cap[i+N][2*N+1]=1;
cost[0][i]=0;
cost[i+N][2*N+1]=0;
}
g<<ford();
f.close();
g.close();
return 0;
}