Cod sursa(job #2466882)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 3 octombrie 2019 10:00:30
Problema Cuplaj maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;
#define NMX 350
#define s n+1
#define t n+m+2
int n,m;

vector<int> v[NMX];
int F[NMX][NMX];
int Ct[NMX][NMX];
int ind[NMX][NMX];

bool inQ[NMX];
bool vis[NMX];
int dist[NMX];
int p[NMX];

int cuplaj;
long cost;

int main()
{
  freopen("cmcm.in","r",stdin);
  freopen("cmcm.out","w",stdout);
  int e;
  scanf("%d %d %d",&n,&m,&e);
  for(int i=0;i<e;i++)
  {
    int j,k,c;
    scanf("%d %d %d",&j,&k,&c);
    v[j].push_back(n+k+1);
    v[k+n+1].push_back(j);
    F[j][k+n+1]=1;
    Ct[j][k+n+1]=c;
    Ct[k+n+1][j]=-c;
    ind[j][k+n+1]=i;
  }
  for(int i=1;i<=n;i++)
  {
    v[s].push_back(i);
    F[s][i]=1;
  }
  for(int i=n+2;i<=n+m+1;i++)
  {
    v[i].push_back(t);
    F[i][t]=1;
  }
  while(1)
  {
    for(int i=1;i<=n+m+2;i++)
      dist[i]=INT_MAX;
    queue<int> q= queue<int>();
    q.push(s);
    inQ[s]=1;
    dist[s]=0;
    memset(vis,0,sizeof(vis));
    while(!q.empty())
    {
      int tp = q.front();
      for(vector<int>::iterator it= v[tp].begin();it!=v[tp].end();++it)
        if(dist[*it]>dist[tp]+Ct[tp][*it]&&F[tp][*it])
        {
          dist[*it]=dist[tp]+Ct[tp][*it];
          p[*it]=tp;
          vis[*it]=1;
          if(!inQ[*it])
          {
            inQ[*it]=1;
            q.push(*it);
          }
        }
      inQ[tp]=0;
      q.pop();
    }
    if(!vis[t]) break;
    for(int i=t;i!=s;i=p[i])
    {
      F[p[i]][i]--;
      F[i][p[i]]++;
      cost+=Ct[p[i]][i];
    }
    cuplaj++;
  }
  printf("%d %ld\n",cuplaj,cost);
  for(int i=1;i<=n;i++)
    if(!F[s][i])
      for(vector<int>::iterator it=v[i].begin();it!=v[i].end();++it)
        if(!F[i][*it])
          printf("%d ",ind[i][*it]+1);
}