Cod sursa(job #762187)

Utilizator lucian666Vasilut Lucian lucian666 Data 29 iunie 2012 11:20:30
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb



using namespace std;
#include<fstream>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<utility>

#define pb push_back
#define NN 1024
#define NN2 10001
#define ff first
#define ss second

ofstream out("critice.out");

vector<int>G[NN],bst;
typedef vector<int>:: iterator IT;
pair<int,int>M[NN2];
int cap[NN][NN],fl[NN][NN],n,m,t[NN],ans;

void read();
void write();
bool BFS();
vector<int>BFS2(int );
void solve();

int main()
{
	read();
	solve();
	write();
	return 0;
	
}

void read()
{
	
	ifstream in("critice.in");
	in>>n>>m;
	for(int x,y,c,i=1;i<=m;++i)
	{
		in>>x>>y>>c;
		cap[x][y]=cap[y][x]=c;
		G[x].pb(y);
		G[y].pb(x);
		M[i].ff=y;
		M[i].ss=x;
	}
}

bool BFS()
{

	vector<bool>uz1(n+1);
	queue<int>Q;
	Q.push(1);
	int k;
	while(!Q.empty())
		{
			k=Q.front();
			//if(k!=n)
				for(IT I=G[k].begin();I!=G[k].end();++I)
					if(!uz1[*I] &&  cap[k][*I] - fl[k][*I] > 0)
					{
						uz1[*I]=1;
						t[*I]=k;
						Q.push(*I);
					}
					Q.pop();
	}
	return uz1[n];
}

vector<int>BFS2(int s)
{
	vector<int>uz2(n+1);
	queue<int>Q;
	Q.push(s);
	int k;
	while(!Q.empty())
		{
			k=Q.front();
				for(IT I=G[k].begin();I!=G[k].end();++I)
					if(!uz2[*I] && cap[k][*I] - (int)abs((double)fl[k][*I]) > 0 && *I!=n && *I!=1) 
						{
							uz2[*I]=1;
							Q.push(*I);
					}
					Q.pop();
	}
	return uz2;
}


void write()
{
	out<<bst.size()<<'\n';
	for(IT i=bst.begin();i!=bst.end();++i)
		out<<*i<<'\n';
}

void solve()
{
	int sol;
	while(BFS())
	{
		for(int i=1;i<n;i++)
			if( fl[i][n] < cap[i][n])
			{
				sol=cap[i][n]-fl[i][n];
				for(int j=i;j!=1;j=t[j])
					if(cap[t[j]][j]-fl[t[j]][j] < sol)
						sol=cap[t[j]][j] -fl[t[j]][j];
					fl[i][n]+=sol;
					fl[n][i]-=sol;
					for(int j=i;j!=1;j=t[j])
					{
						fl[t[j]][j]+=sol;
						fl[j][t[j]]-=sol;
					}
					ans+=sol;
			}
	}
	
	vector<int> uz3=BFS2(1);
	vector<int> uz4=BFS2(n);
	uz3[1]=1;
	uz4[n]=1;
	for(int i=1;i<=m;i++)
		{
			int x=M[i].ff;
			int y=M[i].ss;
			if(fl[x][y]==cap[x][y] || fl[y][x]==cap[y][x]  && ( (uz3[x]&uz4[y]) || (uz3[y]&uz4[x])))
				bst.pb(i);
	}
	
}