Cod sursa(job #1708638)

Utilizator DjokValeriu Motroi Djok Data 27 mai 2016 17:47:07
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<bits/stdc++.h>
using namespace std;

typedef struct lnod {
    int nod;
    lnod *next;
}*nod;

const int INF=1e9+69*69;

int i,n,m,x,y,z,cap[1005][1005],q[1005],qt,qh,tata[1005];
bool viz[1005],froms[1005],fromf[1005];
pair<int,int> edges[10005];
vector<int> rs;
nod lda[1005];

void add(int x,nod &y) {
    nod p=new lnod;
    p->nod=x;
    p->next=y;
    y=p;
}

void Update() {
    int addflow=INF;

    for(x=n;x!=1;x=tata[x]) addflow=min(addflow,cap[tata[x]][x]);

    for(x=n;x!=1;x=tata[x]) cap[tata[x]][x]-=addflow,cap[x][tata[x]]+=addflow;
}

bool bfs() {
    bool u=0;

    memset(viz,0,sizeof(viz));

    viz[1]=1; q[1]=tata[1]=1;

    for(qt=qh=1;qh<=qt;++qh)
     for(nod p=lda[q[qh]];p;p=p->next)
     if(cap[q[qh]][p->nod]>0 && !viz[p->nod])
     {
       tata[p->nod]=q[qh]; q[++qt]=p->nod; viz[p->nod]=1;
       if(p->nod==n) Update(),--qt,viz[n]=0,u=1;
     }

    return u;
}

void dfs(int x,int from) {
    if(from) fromf[x]=1; else froms[x]=1;

    for(nod p=lda[x];p;p=p->next)
    if(from && !fromf[p->nod] && cap[x][p->nod]>0 && cap[p->nod][x]>0) dfs(p->nod,from);
    else if(!from && !froms[p->nod] && cap[x][p->nod]>0 && cap[p->nod][x]>0) dfs(p->nod,from);
}

int main()
{
  ifstream cin("critice.in");
  ofstream cout("critice.out");

  ios_base::sync_with_stdio(0); cin.tie(0);

  cin>>n>>m;
  for(i=1;i<=m;++i)
  {
    cin>>x>>y>>z;
    edges[i]=make_pair(x,y);
    add(x,lda[y]); cap[x][y]=z;
    add(y,lda[x]); cap[y][x]=z;
  }

  while(bfs());

  dfs(1,0); dfs(n,1);

  for(i=1;i<=m;++i)
  {
    x=edges[i].first; y=edges[i].second;

    if((!cap[x][y] || !cap[y][x]) && ((froms[x] && fromf[y]) || (fromf[x] && froms[y]))) rs.push_back(i);
  }

  cout<<rs.size()<<'\n';
  for(auto it:rs) cout<<it<<'\n';

 return 0;
}