Cod sursa(job #2497912)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 23 noiembrie 2019 12:14:37
Problema Critice Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int N=1005;
vector<int> gr[N];
int cap[N][N];
int flow[N][N];
int q[N*N];
int parent[N];
bool bfs(int n){
  int st=0,dr=-1;
  memset(parent,0,sizeof(parent));
  q[++dr]=1;
  parent[1]=1;
  while(st<=dr){
    int nod=q[st++];
    if(nod==n)
      return true;
    for(int fiu:gr[nod]){
      if(parent[fiu]==0 && cap[nod][fiu]-flow[nod][fiu]>0){
        parent[fiu]=nod;
        q[++dr]=fiu;
      }
    }
  }
  return false;
}
int drum(int n){
  int mini=1<<30;
  int tata=parent[n],nod=n;
  while(nod!=1){
    mini=min(mini,cap[tata][nod]-flow[tata][nod]);
    nod=tata;
    tata=parent[tata];
  }
  return mini;
}
void actualizare(int n,int flux){
  int tata=parent[n],nod=n;
  while(nod!=1){
    flow[tata][nod]+=flux;
    flow[nod][tata]-=flux;
    nod=tata;
    tata=parent[tata];
  }
}
int muchii[10005][2];
bool vizs[N],vizd[N];
vector<int> sol;

FILE*fin,*fout;
const int SIZE=1<<10;
char buf[SIZE];
int ptr=SIZE;
char adv(){
  if(ptr==SIZE){
    fread(buf,sizeof(char),SIZE,fin);
    ptr=0;
  }
  return buf[ptr++];
}
int read(){
  int x=0;
  char c=adv();
  while(!(c>='0' && c<='9'))
    c=adv();
  while(c>='0' && c<='9'){
    x=x*10+c-'0';
    c=adv();
  }
  return x;
}

int main()
{
  fin=fopen("critice.in","r");
  fout=fopen("critice.out","w");
  int n,m;
  fscanf(fin,"%d%d",&n,&m);
  for(int i=1;i<=m;i++){
    int x,y,val;
    x=read();
    y=read();
    val=read();
    muchii[i][0]=x;
    muchii[i][1]=y;
    cap[x][y]=val;
    cap[y][x]=val;
    gr[x].push_back(y);
    gr[y].push_back(x);
  }
  while(bfs(n)){
    for(int i=1;i<n;i++){
      if(cap[i][n]-flow[i][n]>0){
        parent[n]=i;
        int f=drum(n);
        actualizare(n,f);
      }
    }
  }
  int st,dr;
  st=0,dr=-1;
  q[++dr]=1;
  vizs[1]=true;
  while(st<=dr){
    int nod=q[st++];
    for(auto i:gr[nod]){
      if(!vizs[i] && cap[nod][i]-flow[nod][i]>0){
        q[++dr]=i;
        vizs[i]=true;
      }
    }
  }
  st=0,dr=-1;
  q[++dr]=n;
  vizd[n]=true;
  while(st<=dr){
    int nod=q[st++];
    for(auto i:gr[nod]){
      if(!vizd[i] && cap[i][nod]-flow[i][nod]>0){
        q[++dr]=i;
        vizd[i]=true;
      }
    }
  }
  for(int i=1;i<=m;i++){
    int x=muchii[i][0],y=muchii[i][1];
    if(((vizs[x] && vizd[y]) || (vizd[x] && vizs[y])) && (cap[x][y]-flow[x][y]==0 || cap[y][x]-flow[y][x]==0))
      sol.push_back(i);
  }
  fprintf(fout,"%d\n",sol.size());
  for(auto x:sol)
    fprintf(fout,"%d\n",x);
  return 0;
}