Pagini recente » Istoria paginii runda/m | Cod sursa (job #2330248) | Cod sursa (job #2445020) | Cod sursa (job #2417474) | Cod sursa (job #1385164)
#include <fstream>
#include <vector>
#include <algorithm>
#include <limits>
#include <queue>
#include <set>
#define mp make_pair
#define pb push_back
#define INF numeric_limits<int>::max()
#define int64 long long
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
vector< vector<int> > a;
queue<int> q;
set<int> sol;
int flow[1005][1005],n,k,s,d,maxflow,pre[1005],f[1005],c[1005][1005],p[1005][1005];
bool v[1005];
//bfs
void bfs(int start)
{
for(int i=1;i<=n;i++)pre[i]=0;
k=0;
pre[s]=s;
q.push(start);
while(!q.empty())
{
int x=q.front();q.pop();
for(vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
if(pre[*i]==0 && flow[x][*i]>0)
{
if(*i==d)
{
f[++k]=x;
continue;
}
pre[*i]=x;
q.push(*i);
}
}
}
void solve(int x,int ok)
{
for(vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
if(v[*i]==false)
{
int val=*i;
if(flow[*i][x]==0 && ok==1)
sol.insert(p[*i][x]);
if(flow[*i][x]>=0)
{
v[val]=true;
solve(*i,(flow[*i][x]==0 ? 0 : 1));
v[val]=false;
}
}
}
int main()
{
int m;
in>>n>>m;
a=vector< vector<int> > (n+1);
for(int i=1;i<=m;i++)
{
int x,y,z;
in>>x>>y>>z;
a[x].pb(y);
a[y].pb(x);
flow[x][y]=flow[y][x]=z;
p[x][y]=p[y][x]=i;
c[x][y]=c[y][x]=z;
}
for(s=1,d=n;;)//sursa, destinatie
{
bfs(s);
if(k==0)break;
for(int i=1;i<=k;i++)
{
int mx=INF;
pre[d]=f[i];
for(int x=d;pre[x]!=x;x=pre[x])
mx=min(mx,flow[pre[x]][x]);
for(int x=d;pre[x]!=x;x=pre[x])
{
flow[pre[x]][x]-=mx;
flow[x][pre[x]]+=mx;
}
maxflow+=mx;
}
}
v[n]=true;
solve(n,0);
out<<sol.size()<<'\n';
for(set<int>::iterator i=sol.begin();i!=sol.end();i++)
out<<*i<<'\n';
return 0;
}