Cod sursa(job #852506)

Utilizator stoicatheoFlirk Navok stoicatheo Data 11 ianuarie 2013 12:53:29
Problema Paznici2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<deque>
#include<queue>
#include<set>
#include<vector>
using namespace std;
 
#define LL long long
#define II inline
#define pb push_back
#define fs first
#define ss second
#define all(c) c, c+GMAX
#define FORIT(it, v) for(it = v.begin() ; it != v.end() ; it++)
 
const int INF = 1000000005;
const int NMAX = 205;
const int GMAX = 2*NMAX + 2;
 
int N, S, D, REZ;
 
int cost[GMAX][GMAX];
vector<int> G[GMAX];
int F[GMAX][GMAX], C[GMAX][GMAX];
int dist[GMAX], tata[GMAX];
 
void citi()
{
    scanf("%d", &N);
    S = 0;
    D = 2*N + 1;
    for(int i = 1 ; i <= N ; i++)
        for(int j = N + 1; j <= 2 * N ; j++)
        {
            scanf("%d", &cost[i][j]);
            cost[j][i] = -cost[i][j];
            G[i].push_back(j);
            G[j].push_back(i);
            C[i][j] = 1;
        }
    for(int i = 1 ; i <= N ; i++)
    {
        G[i].push_back(S);
        G[S].push_back(i);
        C[S][i] = 1;
    }
    for(int j = N + 1; j <= 2 * N ; j++)
    {
        G[D].push_back(j);
        G[j].push_back(D);
        C[j][D] = 1;
    }
}
 
int BFS(int sursa)
{
    vector<int> :: iterator it;
    queue<int> Q;
     
    fill(all(dist), INF);
    fill(all(tata), 0);
     
    dist[sursa] = 0;
    Q.push(sursa);
     
    while(!Q.empty())
    {
        int x = Q.front();
        Q.pop();
         
        FORIT(it, G[x])
            if(F[x][*it] < C[x][*it] && dist[*it] > dist[x] + cost[x][*it])
            {
                dist[*it] = dist[x] + cost[x][*it];
                tata[*it] = x;
                Q.push(*it);
            }
    }
     
    return dist[D] != INF;
}
 
void flux()
{
    while(BFS(S))
    {
        for(int nod = D ; nod != S ; nod = tata[nod])
        {
            F[tata[nod]][nod]++, F[nod][tata[nod]]--;
            REZ += cost[tata[nod]][nod];
        }
    }
}
 
void scrie()
{
    printf("%d\n", REZ);
    for(int j = N + 1 ; j <= 2 * N ; j++)
    {
        BFS(j);
        int sol[NMAX] = {0};
        for(int i = 1 ; i <= N ; i++)
            if(cost[i][j] + dist[i] == 0)
                sol[++sol[0]] = i;
             
        for(int k = 0 ; k <= sol[0] ; k++)
            printf("%d ", sol[k]);
        printf("\n");
    }
}
 
int main()
{
    freopen("paznici2.in", "r", stdin);
    freopen("paznici2.out", "w", stdout);
    citi();
    flux();
    scrie();
    return 0;
}