Cod sursa(job #2877193)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 24 martie 2022 11:58:29
Problema Paznici2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.52 kb
#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';

    }






}