Cod sursa(job #180311)

Utilizator cretuMusina Rares cretu Data 16 aprilie 2008 21:15:45
Problema Paznici2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#include <queue>
#include <vector>
#define INF 0x3f3f3f
#define MAX 420

using namespace std;

int cost[MAX][MAX], cmin[MAX], u[MAX];
bool F[MAX][MAX], s[MAX];
int n;

bool BellmanFord(int S, int D)
{
     int i, j;     
     queue<int> q;
     
     for (i = 0; i <= D; i++)
         cmin[i] = INF, s[i] = 0, u[i] = -1;
     
     q.push(S);
     cmin[S] = 0;
     s[S] = 1;
     
     while (!q.empty())
     {
          i = q.front();
          q.pop();  
          s[i] = 0;         
          for (j = 0; j <= D; j++)
              if (F[i][j] && cmin[j] > cmin[i] + cost[i][j])
              {
                  cmin[j] = cmin[i] + cost[i][j];
                  u[j] = i;
                  if (!s[j])
                  {
                     s[j] = 1;
                     q.push(j);
                  }             
              }
     }      
        
     return (cmin[D] != INF);    
}

int main()
{
    int i, j, rez = 0, S = 0, D, p[MAX];
    
    ifstream fin("paznici2.in");
    fin >> n;
 
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
        {
             fin >> cost[i][n+j];
             cost[n+j][i] -= cost[i][n+j];
             F[i][n+j] = 1;
        }
    fin.close();
    
    D = 2*n+1;
    for (i = 1; i <= n; i++)
        F[0][i] = 1;
    for (i = n+1; i <= 2*n; i++)
        F[i][D] = 1;
    
    
    for (; BellmanFord(S, D); rez += cmin[D])
    {
         for (i = D; i; i = u[i])      
             F[u[i]][i] = 0, F[i][u[i]] = 1;
    }
      
    ofstream fout("paznici2.out");
    fout << rez << "\n";
    int x;
    for (i = n+1; i < D; i++)
    {
        x = 0;
        BellmanFord(i, D);
        for (j = 1; j <= n; j++)
            if (cost[i][j] == cmin[j]) p[++x] = j;
            
        fout << x << " ";
        
        for (j = 1; j <= x; j++)
            fout << p[j] << " ";
        fout << "\n";
    }
    fout.close();
    
    return 0;
}