Pagini recente » Cod sursa (job #2242424) | Cod sursa (job #3132254) | Cod sursa (job #1038938) | Cod sursa (job #2347682) | Cod sursa (job #751316)
Cod sursa(job #751316)
# include <fstream>
# include <iostream>
# include <vector>
# include <algorithm>
# include <queue>
# define DIM 1003
# define INF 32000
# define pb push_back
# define mp make_pair
# define fs first
# define sc second
# define sint short int
using namespace std;
sint n, m, c[DIM][DIM], index[DIM][DIM], t[DIM], r[10*DIM];
vector<sint>G[DIM];
vector< pair<sint,sint> >L;
void read ()
{
ifstream fin ("critice.in");
fin>>n>>m;
for(sint i=1;i<=m;++i)
{
sint x, y, z;
fin>>x>>y>>z;
G[x].pb(y);
G[y].pb(x);
c[x][y]=c[y][x]=z;
index[x][y]=index[y][x]=i;
}
}
bool bfs (sint s, sint f)
{
queue<sint>Q;
for(sint i=1;i<=n;++i)
t[i]=-1;
Q.push(s);
sint k;
t[s]=0;
while(Q.size())
{
k=Q.front();Q.pop();
for(vector<sint>::iterator I=G[k].begin();I!=G[k].end();++I)
if (t[*I]==-1 && c[k][*I])
{
t[*I]=k;
if (*I==f)return true;
Q.push(*I);
}
}
return false;
}
void EK ()
{
sint cmin;
while(bfs(1,n))
{
cmin=INF;
for(sint i=n;t[i];i=t[i])
cmin=min(cmin,c[i][t[i]]);
for(sint i=n;t[i];i=t[i])
{
c[i][t[i]]-=cmin;
c[t[i]][i]-=cmin;
if (!c[i][t[i]])
L.pb(mp(t[i],i));
}
}
}
void bf (sint s, sint v[])
{
queue<int>Q;
Q.push(s);
int k;
while(Q.size())
{
k=Q.front();Q.pop();
if (!v[k])
v[k]=1;
for(vector<sint>::iterator I=G[k].begin();I!=G[k].end();++I)
if (!v[*I] && c[k][*I])
Q.push(*I);
}
}
void comp ()
{
sint v1[DIM], v2[DIM];
for(sint i=1;i<=n;++i)
v1[i]=v2[i]=0;
bf(1, v1);
bf(n, v2);
for(vector< pair<sint,sint> >::iterator I=L.begin();I!=L.end();++I)
{
sint i=I->fs, j=I->sc;
if ((v1[i] && v2[j]) || (v1[j] && v2[i]))
r[index[i][j]]=1, ++r[0];
}
}
int main ()
{
read ();
EK ();
comp ();
ofstream fout ("critice.out");
fout<<r[0]<<"\n";
for(sint i=1;i<=m;++i)
if (r[i])
fout<<i<<"\n";
return 0;
}