Pagini recente » Cod sursa (job #2759646) | Cod sursa (job #2578054) | Cod sursa (job #908277) | Cod sursa (job #2357575) | Cod sursa (job #1798435)
#include <bits/stdc++.h>
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
const int INF=1<<20;
int n,m,i,x,y,c,sol;
int ant[1<<10],rez[1<<10][1<<10];
bool a[1<<10],b[1<<10];
vector<int> V[1<<10];
vector <pair <int,int> > M;
bool bfs(int s,int d)
{
bool viz[1<<10];
memset(viz,0,sizeof viz);
queue<int> q;
viz[s]=1;
q.push(s);
ant[s]=s;
while(!q.empty())
{
int nod=q.front();
for(int i=0;i<V[nod].size();++i)
{
int x=V[nod][i];
if(!viz[x]&&rez[nod][x]>0)
{
viz[x]=1;
if(x==d) return 1;
q.push(x);
ant[x]=nod;
}
}
q.pop();
}
return 0;
}
void solve()
{
int s=1;
int d=n;
while(bfs(s,d))
{
for(int i=0;i<V[d].size();++i)
{
int nod=V[d][i];
int maxFlow=INF;
ant[d]=nod;
for(int i=d;i!=ant[i];i=ant[i])
maxFlow=min(maxFlow,rez[ant[i]][i]);
for(int i=d;i!=ant[i];i=ant[i])
{
rez[ant[i]][i]-=maxFlow;
rez[i][ant[i]]+=maxFlow;
}
}
}
}
void search(int s,bool viz[])
{
queue<int> q;
viz[s]=1;
q.push(s);
while(!q.empty())
{
int nod=q.front();
for(int i=0;i<V[nod].size();++i)
{
int x=V[nod][i];
if(!viz[x]&&rez[nod][x]>0&&rez[x][nod])
{
viz[x]=1;
q.push(x);
}
}
q.pop();
}
}
int main()
{
f>>n>>m;
for(i=1;i<=m;++i)
{
f>>x>>y>>c;
M.push_back(make_pair(x,y));
V[x].push_back(y);
V[y].push_back(x);
rez[x][y]=rez[y][x]=c;
}
solve();
search(1,a);
search(n,b);
for(i=0;i<M.size();++i)
if((a[M[i].first]&&b[M[i].second])||(a[M[i].second]&&b[M[i].first])) ++sol;
g<<sol<<'\n';
for(i=0;i<M.size();++i)
if((a[M[i].first]&&b[M[i].second])||(a[M[i].second]&&b[M[i].first])) g<<i+1<<'\n';
return 0;
}