Pagini recente » Cod sursa (job #1814715) | Cod sursa (job #516923) | Cod sursa (job #120343) | Cod sursa (job #1211917) | Cod sursa (job #761327)
Cod sursa(job #761327)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
const int N=1005;
int c[N][N],f[N][N];
int pred[N],sol[N],viz[N],n,m;
bool use[N];
struct point
{
int x,y;
};
point a[10005];
vector <int> v[N];
bool bfs(int S, int D)
{
int x;
memset(use,false,sizeof(use));
memset(pred,0,sizeof(pred));
if(S==D)
return true;
queue<int> q;
q.push(S);
use[S]=true;
while(!q.empty())
{
x=q.front();
q.pop();
for(vector<int> :: iterator it=v[x].begin(); it!=v[x].end(); it++)
{
if(!use[*it] && c[x][*it]-f[x][*it]>0)
{
use[*it]=true;
q.push(*it);
pred[*it]=x;
if((*it)==D)
return true;
}
}
}
return false;
}
int calcmin(int x)
{
int min=c[x][n]-f[x][n];
while(pred[x])
{
if(c[pred[x]][x]-f[pred[x]][x]<min)
min=c[pred[x]][x]-f[pred[x]][x];
x=pred[x];
}
return min;
}
void flux()
{
int flux,x,mm;
while(bfs(1,n))
{
for(vector<int> :: iterator i=v[n].begin();i!=v[n].end();i++)
{
if(!use[*i] || f[*i][n]==c[*i][n])
continue;
if(c[*i][n]>0)
{
mm=calcmin(*i);
flux+=mm;
f[*i][n]+=mm;
f[n][*i]-=mm;
x=*i;
while(pred[x])
{
f[pred[x]][x]+=mm;
f[x][pred[x]]-=mm;
x=pred[x];
}
}
}
}
}
void dfs(int x,int g)
{
for(vector<int> :: iterator i=v[x].begin();i!=v[x].end();i++)
{
if(c[x][*i]-f[x][*i] >0 && !viz[*i])
{
viz[*i]=g;
dfs(*i,g);
}
}
}
int main()
{
int i,nr=0,x,y,cost;
in>>n>>m;
for(i=1;i<=m;i++)
{
in>>a[i].x>>a[i].y>>cost;
c[a[i].x][a[i].y]+=cost;
c[a[i].y][a[i].x]+=cost;
v[a[i].x].push_back(a[i].y);
v[a[i].y].push_back(a[i].x);
}
flux();
viz[1]=1;
viz[n]=n;
dfs(1,1);
dfs(n,n);
for(i=1;i<=m;i++)
{
x=a[i].x;
y=a[i].y;
if((c[x][y]-f[x][y]==0) || (c[x][y]+f[x][y]==0))
{
if((viz[x]==1 && viz[y]==n) || (viz[x]==n && viz[y]==1))
{
nr++;
sol[nr]=i;
}
}
}
out<<nr<<"\n";
for(i=1;i<=nr;i++)
out<<sol[i]<<"\n";
return 0;
}