Pagini recente » Cod sursa (job #3260014) | Cod sursa (job #2014334) | Cod sursa (job #3205344) | Cod sursa (job #3154264) | Cod sursa (job #1004296)
#include <fstream>
#include <vector>
#include <cstring>
#include <utility>
#define maxn 1003
#define inf 1<<30////////////////////////////////////////////////
#define vint vector<int>::iterator
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
vector <int> G[maxn],S;
vector <pair<int,int> > L;
int C[maxn][maxn],F[maxn][maxn],T[maxn],mark[maxn][maxn],q[maxn];
bool viz[maxn],viz2[maxn];
int n,m,a,b,c,nr;
bool bfs ()
{
memset (viz,0,n+1);
int s=1,l=1;
q[s]=1;
viz[1]=1;
for (;s<=l;++s)
{
if (q[s]==n) continue;
int x=q[s];
for (vint it = G[x].begin(); it!=G[x].end(); ++it)
{
if (viz[*it] || C[x][*it]==F[x][*it]) continue;
viz[*it] = 1;
q[++l] = *it;
T[*it] = x;
}
}
return viz[n];
}
bool bfs2 ()
{
memset (viz2,0,n+1);
int s=1,l=1;
q[s]=n;
viz2[n]=1;
for (;s<=l;++s)
{
if (q[s]==1) continue;
int x=q[s];
for (vint it = G[x].begin(); it!=G[x].end(); ++it)
{
if (viz2[*it] || F[x][*it]==-C[x][*it]) continue;
viz2[*it] = 1;
q[++l] = *it;
}
}
return viz2[n];
}
int main()
{
fin>>n>>m;
for (int i=1; i<=m; ++i)
{
fin>>a>>b>>c;
G[a].push_back(b);
G[b].push_back(a);
C[a][b]=c;
C[b][a]=c;
L.push_back(make_pair(a,b));
}
int flow=0;
while (bfs())
{
for (vint it = G[n].begin(); it!=G[n].end(); ++it)
{
if (!viz[*it] || F[*it][n]==C[*it][n]) continue;
T[n]=*it;
int minf=inf;
for (int i=n; i!=1; i=T[i])
{
minf = min (minf,C[T[i]][i] - F[T[i]][i]);
}
for (int i=n; i!=1; i=T[i])
{
F[T[i]][i] += minf;
F[i][T[i]] -= minf;
}
flow += minf;
}
}
bfs2();
for (int i=0; i<L.size(); ++i)
{
if ((viz[L[i].first]&&viz2[L[i].second]) || (viz[L[i].second]&&viz2[L[i].first]))
{
S.push_back (i+1);
}
}
fout<<S.size()<<"\n";
for (int i=0; i<S.size(); ++i)
fout<<S[i]<<"\n";
}