Cod sursă (job #307242)

Utilizator avatar Robert Popovici Robert Robert IP ascuns
Problemă Canibali (lot liceu) Compilator cpp | 1,33 kb
Rundă Arhiva de probleme Status evaluat
Dată 13 iun. 2017 20:46:02 Scor 100
#include <bits/stdc++.h>
#define MAXN 2048
int X[MAXN+1],Y[MAXN+1],Z[MAXN+1],T[MAXN+1];
std::vector <int> g[3*MAXN+1];
int v[3*MAXN+1];
bool viz[3*MAXN+1];
bool cauta(int nod){
   for(auto it:g[nod])
     if(v[it]==0){
        v[nod]=it;
        v[it]=nod;
        return 1;
     }
   viz[nod]=1;
   for(auto it:g[nod])
     if(viz[v[it]]==0&&cauta(v[it])==1){
        v[it]=nod;
        v[nod]=it;
        return 1;
     }
   return 0;
}
int main(){
    FILE*fi,*fout;
    int i,n,j,ans;
    bool flag;
    fi=fopen("canibali.in" ,"r");
    fout=fopen("canibali.out" ,"w");
    fscanf(fi,"%d " ,&n);
    for(i=1;i<=n;i++)
      fscanf(fi,"%d %d %d %d " ,&X[i],&Y[i],&Z[i],&T[i]);
    for(i=1;i<=n;i++)
     for(j=1;j<=n;j++)
      if(i!=j&&X[i]>=X[j]&&Y[i]>=Y[j]&&Z[i]>=Z[j]&&T[i]>=T[j]){
        if(X[i]==X[j]&&Y[i]==Y[j]&&Z[i]==Z[j]&&T[i]==T[j]){
          if(i<j){
            g[i].push_back(j+2*n);
            g[i+n].push_back(j+2*n);
          }
        }
        else{
           g[i].push_back(j+2*n);
           g[i+n].push_back(j+2*n);
        }
      }
    flag=1;
    while(flag){
       memset(viz,0,sizeof(viz));
       flag=0;
       for(i=1;i<=2*n;i++)
        if(v[i]==0)
         flag|=cauta(i);
    }
    ans=0;
    for(i=1;i<=2*n;i++)
      ans+=(v[i]>0);
    fprintf(fout,"%d" ,n-ans);
    fclose(fi);
    fclose(fout);
    return 0;
}