Pagini recente » Cod sursa (job #2639566) | Cod sursa (job #1877137) | Cod sursa (job #2792525) | Cod sursa (job #1037462) | Cod sursa (job #2877193)
#include <bits/stdc++.h>
#define pb push_back
#define ll long long
using namespace std;
ifstream f("paznici2.in");
ofstream g("paznici2.out");
int N,salariu[405][405],sursa,dest;
int cost[405][405];
vector<int> adj[405];
int flux[405][405],cap[405][405],dist[405];
int solutie=0;
int tata[405];
void addedge(int x,int y,int capacitate,int val)
{
adj[x].push_back(y);
adj[y].push_back(x);
cost[x][y]+=val;
cost[y][x]-=val;///reverse edge
cap[x][y]+=capacitate;
}
bool bellmanford(int nod)
{
for(int i=0;i<=2*N+1;i++)
{
dist[i]=1e9;
}
dist[nod]=0;
queue<int> Q;
Q.push(nod);
vector<bool> viz(2*N+5,0);viz[nod]=1;
while(!Q.empty())
{
int node=Q.front();
viz[node]=0;
Q.pop();
for(auto vec:adj[node])
{
//cout<<node<<" ";
if(cap[node][vec]-flux[node][vec]<=0) continue;
if(dist[vec]>dist[node]+cost[node][vec])
{
dist[vec]=dist[node]+cost[node][vec];
tata[vec]=node;
if(viz[vec]==0)
{
viz[vec]=1;
Q.push(vec);
}
}
}
}
if(dist[dest]==1e9) return 0;
return 1;
}
int main ()
{
f>>N;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
f>>salariu[i][j];
addedge(i,j+N,1,salariu[i][j]);
}
}
sursa=0;
dest=2*N+1;
for(int i=1;i<=N;i++)
{
addedge(sursa,i,1,0);
addedge(i+N,dest,1,0);
}
///solutia este fluxul maxim de cost minim de la sursa la destinatie
while(bellmanford(sursa))
{
int node=dest;
int flow=1e9;
while(node!=sursa)
{
flow=min(flow,cap[tata[node]][node]-flux[tata[node]][node]);
node=tata[node];
}
node=dest;
while(node!=sursa)
{
solutie+=flow*cost[tata[node]][node];
flux[tata[node]][node]+=flow;
flux[node][tata[node]]-=flow;
node=tata[node];
}
}
g<<solutie<<'\n';
for(int j=N+1;j<=2*N;j++)
{
int x=bellmanford(j);
vector<int> ans;
for(int i=1;i<=N;i++)
{
if(cost[j][i]==dist[i])
{
ans.pb(i);
}
}
g<<ans.size()<<" ";
for(auto x:ans) g<<x<<" ";
g<<'\n';
}
}