Pagini recente » Cod sursa (job #2037014) | Cod sursa (job #970444) | Cod sursa (job #1962415) | Cod sursa (job #381652) | Cod sursa (job #1242380)
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int m, a[10009], b[10009], c[10009];
class graph
{
public:
int flux, N, S, D, f[1009][1009], c[1009][1009], t[1009], ap[2][1009];
vector < int > muchii[1009], v[2][1009];
void Add_edge (int i, int j, int cost)
{
muchii[i].push_back(j);
muchii[j].push_back(i);
c[i][j] = c[j][i] = cost;
}
bool bfs()
{
queue < int > q;
for (int i=1; i<=N; i++)
t[i] = -1;
q.push(S);
t[S] = 0;
while (!q.empty())
{
int nod = q.front();
q.pop();
for (vector < int > :: iterator it = muchii[nod].begin(); it != muchii[nod].end(); it++)
if (t[*it] == -1 && f[nod][*it] < c[nod][*it])
{
t[*it] = nod;
if (*it == D) return 1;
q.push(*it);
}
}
return 0;
}
void calc_flux()
{
flux = 0;
while ( bfs() )
{
for (vector < int > :: iterator it = muchii[D].begin(); it != muchii[D].end(); it++)
if (t[*it] != -1 && f[*it][D] < c[*it][D])
{
int nod = *it, fmin = 100000;
t[D] = nod;
for (int i = D; i != S; i = t[i])
if (c[t[i]][i] - f[t[i]][i] < fmin)
fmin = c[t[i]][i] - f[t[i]][i];
flux += fmin;
for (int i = D; i != S; i = t[i])
{
f[t[i]][i] += fmin;
f[i][t[i]] -= fmin;
}
}
}
}
void dfs (int nod, int lin)
{
ap[lin][nod] = 1;
for (vector < int > :: iterator it = v[lin][nod].begin(); it != v[lin][nod].end(); it ++)
if (ap[lin][*it] == 0) dfs (*it, lin);
}
void calc_ap01 ()
{
for (int i=1; i<=N; i++)
{
ap[0][i] = ap[1][i] = 0;
for (vector < int > :: iterator it = muchii[i].begin(); it != muchii[i].end(); it++)
if (f[i][*it] < c[i][*it])
{
v[0][i].push_back(*it);
v[1][*it].push_back(i);
}
}
dfs (S, 0);
dfs (D, 1);
}
}graf;
void build_graph()
{
scanf ("%d", &graf.N);
scanf ("%d", &m);
graf.S = 1;
graf.D = graf.N;
for (int i=1; i<=m; i++)
{
scanf ("%d %d %d", &a[i], &b[i], &c[i]);
graf.Add_edge (a[i], b[i], c[i]);
}
}
int main()
{
freopen ("critice.in", "r", stdin);
freopen ("critice.out", "w", stdout);
build_graph();
graf.calc_flux();
graf.calc_ap01();
vector < int > ans;
for (int i=1; i<=m; i++)
if ( ( graf.ap[0][a[i]] && graf.ap[1][b[i]] ) || ( graf.ap[1][a[i]] && graf.ap[0][b[i]] ) )
ans.push_back(i);
printf ("%d\n", ans.size());
for (int i=0; i<ans.size(); i++)
printf ("%d\n", ans[i]);
return 0;
}