Cod sursa(job #1161619)

Utilizator NistorSergiuNistor Sergiu NistorSergiu Data 31 martie 2014 12:42:30
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.7 kb
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#define NMax 1001
#define ffx mu[i].first
#define ssy mu[i].second
using namespace std;

int n;
int flux[NMax][NMax];
int cap[NMax][NMax];
vector <int> grr[NMax];
vector <int> sol;
vector <pair<int,int> > mu;
int tata[NMax];
queue <int> q;
bool vizs[NMax];
bool vizd[NMax];
bool bfs(int s)
{
    int i;
    for(i=1;i<=n;i++)
        tata[i]=0;
    tata[s]=s;
    q.push(s);
    while(!q.empty())
    {
        s=q.front();
        q.pop();
        if(s!=n)
        {
            for(i=0;i<grr[s].size();i++)
                if((flux[s][grr[s][i]]!=cap[s][grr[s][i]])&&(!tata[grr[s][i]]))
                {
                    tata[grr[s][i]]=s;
                    q.push(grr[s][i]);
                }
        }
    }
    if(tata[n])
        return 1;
    return 0;
}
bool saturata(int x, int y)
{
    if(flux[x][y]==cap[x][y])
        return 1;
    if(flux[y][x]==cap[x][y])
        return 1;
    return 0;
}
void dfss(int s)
{
    int i;
    vizs[s]=1;
    for(i=0;i<grr[s].size();i++)
        if(!saturata(s,grr[s][i]) && !vizs[grr[s][i]])
            dfss(grr[s][i]);
}
void dfsd(int s)
{
    int i;
    vizd[s]=1;
    for(i=0;i<grr[s].size();i++)
        if(!saturata(s,grr[s][i]) && !vizd[grr[s][i]])
            dfsd(grr[s][i]);
}
int main()
{
    int m;
    int i;
    int x,y,c;
    int fmin,vf;
    //int flow=0;
    ifstream f("critice.in");
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>c;
        cap[x][y]+=c;
        cap[y][x]+=c;
        grr[x].push_back(y);
        grr[y].push_back(x);
        mu.push_back(make_pair(x,y));
    }
    f.close();
    while(bfs(1))
    {
        for(i=0;i<grr[n].size();i++)
            if((flux[grr[n][i]][n]!=cap[grr[n][i]][n])&&(tata[grr[n][i]]))
            {
                vf=grr[n][i];
                tata[n]=vf;
                fmin=cap[vf][n]-flux[vf][n];
                while(vf!=1)
                {
                    fmin=min(fmin,cap[tata[vf]][vf]-flux[tata[vf]][vf]);
                    vf=tata[vf];
                }
                if(fmin>0)
                {
                    vf=n;
                    while(vf!=1)
                    {
                        flux[tata[vf]][vf]+=fmin;
                        flux[vf][tata[vf]]-=fmin;
                        vf=tata[vf];
                    }
                   // flow+=fmin;
                }
            }
    }
    dfss(1);
    dfsd(n);
    for(i=0;i<mu.size();i++)
        if(saturata(ffx,ssy)&&((vizs[ffx]&&vizd[ssy])||(vizd[ffx]&&vizs[ssy])))
            sol.push_back(i);
    ofstream g("critice.out");
    g<<sol.size()<<'\n';
    for(i=0;i<sol.size();i++)
        g<<sol[i]+1<<"\n";
    g<<'\n';
    g.close();
    return 0;
}