Pagini recente » Cod sursa (job #2185154) | Cod sursa (job #3042163) | Cod sursa (job #2125330) | Cod sursa (job #311652) | Cod sursa (job #1869972)
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#define NMAX 1000
#define MMAX 10000
#define inf 1000000
using namespace std;
int n,m,i;
int T[NMAX+5],C[NMAX+5][NMAX+5],F[NMAX+5][NMAX+5],sat[2][NMAX+5];
queue <int> q;
vector <int> sol,G[NMAX+5];
vector <pair <int,int> > v;
bool bfs()
{
int i,node,s,son;
bool ok=false;
for(i=1; i<=n; ++i)
T[i]=0;
q.push(1);
T[1]=-1;
while(!q.empty())
{
node=q.front();
q.pop();
s=G[node].size();
for(i=0; i<s; ++i)
{
son=G[node][i];
if(!T[son] && C[node][son]>F[node][son])
{
if(son==n)
ok=true;
else
{
T[son]=node;
q.push(son);
}
}
}
}
return ok;
}
void maxflow()
{
int i,s=G[n].size(),flux,node;
while(bfs())
{
for(i=0; i<s; ++i)
{
flux=inf;
T[n]=G[n][i];
node=n;
while(T[node]!=-1 && flux)
{
flux=min(flux,C[T[node]][node]-F[T[node]][node]);
node=T[node];
}
if(!flux)
continue;
node=n;
while(T[node]!=-1)
{
F[T[node]][node]+=flux;
F[node][T[node]]-=flux;
node=T[node];
}
}
}
}
void bfs2(int node,int ind,int endd)
{
int i,s,son;
q.push(node);
sat[ind][node]=1;
while(!q.empty())
{
node=q.front();
q.pop();
s=G[node].size();
for(i=0; i<s; ++i)
{
son=G[node][i];
if(!sat[ind][son] && C[node][son]>F[node][son])
{
sat[ind][son]=1;
if(son!=endd)
q.push(son);
}
}
}
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1; i<=m; ++i)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
G[x].push_back(y);
G[y].push_back(x);
C[x][y]=c;
C[y][x]=c;
v.push_back(make_pair(x,y));
}
maxflow();
bfs2(1,0,n);
bfs2(n,1,1);
for(i=0; i<m; ++i)
{
int node1=v[i].first,node2=v[i].second;
if(F[node1][node2]<C[node1][node2] && F[node2][node1]<C[node2][node1])
continue;
if((sat[0][node1] && sat[1][node2]) || (sat[1][node1] && sat[0][node2]))
sol.push_back(i+1);
}
printf("%d\n",sol.size());
int s=sol.size();
for(i=0; i<s; ++i)
printf("%d\n",sol[i]);
return 0;
}