Cod sursa(job #641555)

Utilizator andrei.finaruFinaru Andrei Emanuel andrei.finaru Data 28 noiembrie 2011 20:17:06
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>

using namespace std;

struct per
{
    int a,b;
} muchii[10001];
int i,j,n,m,c[1001][1001],flux[1001][1001],x,y,tata[1001],minim,flux_maxim,k;
vector<int> lista[1001], rez;
//vector< pair <int,int> > muchii;
queue<int> coada;
int viz[1001];

ifstream f("critice.in");
ofstream g("critice.out");

int caut(int a,int b)
{
    int i;
    for(i=1;i<=m;++i) if(muchii[i].a==a&&muchii[i].b==b || muchii[i].b==a&&muchii[i].a==b) return i;
    return 0;
}

int bf()
{
   memset(viz,0,sizeof(viz));
   memset(tata,0,sizeof(tata));

	int x,i,nr_vecini,vecin;
	coada.push(1);
   // g<<1<<' ';
	while(!coada.empty())
	{
		x=coada.front(); coada.pop();
		nr_vecini=lista[x].size();
		for(i=0;i<nr_vecini;i++)
		{
		    vecin=lista[x][i];
			if(!viz[vecin]&&flux[x][vecin]<c[x][vecin])
			{
				viz[vecin]=1;
				tata[vecin]=x;
				coada.push(vecin);
				//g<<vecin<<' ';
			}
		}
	}
	//g<<" sfarsit_coada\n";
 return viz[n];
}


int main()
{
	f>>n>>m;
	for(i=1;i<=m;i++)
	{
		f>>x>>y>>j;
		muchii[i].a=x;
		muchii[i].b=y;
		//muchii.push_back(make_pair(x,y));
		lista[x].push_back(y);
		lista[y].push_back(x);
		if(x==1||y==n) c[x][y]=j;
            else if(y==1||x==n) c[y][x]=j;
                    else c[x][y]=c[y][x]=j;
	}

	while(bf())
	{
		for(i=1;i<n;i++)
			if(tata[i] && flux[i][n]<c[i][n])
			{
				minim=c[i][n]-flux[i][n];
				for(j=i;j!=1;j=tata[j])
					if(c[tata[j]][j]-flux[tata[j]][j]<minim)
						minim=c[tata[j]][j]-flux[tata[j]][j];

                if(minim)
					{
						flux[i][n]=flux[i][n]+ minim;
						flux[n][i]=flux[n][i]- minim;

						for(j=i;j!=1;j=tata[j])
						{
							flux[tata[j]][j]=flux[tata[j]][j]+ minim;
							flux[j][tata[j]]=flux[j][tata[j]]-minim;
						}
						//g<<" adaug la flux "<<minim<<'\n';
						flux_maxim=flux_maxim+minim;
					}
			}
	}
	//g<<flux_maxim<<'\n';
	for(i=1;i<=n;++i)
	{
	    j=lista[i].size();
	    for(int q=0;q<j;++q)
            if(c[i][lista[i][q]]>=0)
            {
                //g<<i<<' '<<lista[i][q]<<'\n';
                ++c[i][lista[i][q]];
                if(bf())
                {
                    ++k;
                    int w=caut(i,lista[i][q]);
                    rez.push_back(w);
                    //g<<i<<' '<<lista[i][q]<<'\n';
                }
                --c[i][lista[i][q]];
            }
	}
	g<<k<<'\n';
	for(i=0;i<k;++i) g<<rez[i]<<'\n';
	f.close();g.close();
	return 0;
}