Pagini recente » Cod sursa (job #1853464) | Cod sursa (job #1760278) | Cod sursa (job #215424) | Cod sursa (job #307828) | Cod sursa (job #1763821)
#include <bits/stdc++.h>
#define maxN 1005
#define INF (1<<30)
using namespace std;
int t[maxN];
queue<int> Que;
bool seen[maxN],vis[3][maxN];
vector<int>v[maxN],sol;
vector<pair<int,int> >edge;
int maxflow,addflow,nod;
int n,m,i,j,x,y,z,source,sink;
int cap[maxN][maxN],flow[maxN][maxN];
bool bfs()
{
memset(seen,false,sizeof(seen));
seen[source]=true;
Que.push(source);
while(!Que.empty())
{
int node=Que.front();
Que.pop();
if(node==sink)
continue;
for(vector<int>::iterator it=v[node].begin();it!=v[node].end();it++)
{
if(seen[*it] || flow[node][*it]>=cap[node][*it])
continue;
t[*it]=node;
seen[*it]=true;
Que.push(*it);
}
}
return seen[sink];
}
void dfs(int ind,int node)
{
vis[ind][node]=true;
for(vector<int>::iterator it=v[node].begin();it!=v[node].end();it++)
if(!vis[ind][*it] && flow[node][*it]!=cap[node][*it] && flow[*it][node]!=cap[*it][node])
dfs(ind,*it);
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d %d",&n,&m);
source=1,sink=n;
for(i=1;i<=m;i++)
scanf("%d %d %d",&x,&y,&z),
v[x].push_back(y),
v[y].push_back(x),
cap[x][y]=cap[y][x]=z,
edge.push_back(make_pair(x,y));
while(bfs())
for(vector<int>::iterator pr=v[sink].begin();pr!=v[sink].end();pr++)
if(seen[*pr])
{
t[sink]=*pr;
addflow=INF;
for(nod=sink;nod!=source;nod=t[nod])
addflow=min(addflow,cap[t[nod]][nod]-flow[t[nod]][nod]);
for(nod=sink;nod!=source;nod=t[nod])
flow[t[nod]][nod]+=addflow,
flow[nod][t[nod]]-=addflow;
}
dfs(1,source);
dfs(2,sink);
for(size_t i=0;i<edge.size();i++)
{
x=edge[i].first;
y=edge[i].second;
if(vis[1][x]&&vis[2][y] || vis[2][x]&&vis[1][y])
sol.push_back(i+1);
}
printf("%d\n",sol.size());
for(size_t i=0;i<sol.size();i++)
printf("%d\n",sol[i]);
return 0;
}