Pagini recente » Cod sursa (job #587342) | Cod sursa (job #315339) | Cod sursa (job #1586873) | Cod sursa (job #992963) | Cod sursa (job #1191224)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
vector< int > L[1005];
vector< int >::iterator it;
const int INF = 1000000000;
int muchii[10005][2],C[1005][1005],F[1005][1005],q[1005],sol[10005],T[1005],verif[10005];
bool viz[1005],vizn[1005];
int n,m,i,p,u,x,y,z,Min,k,nod;
inline int minim(int a, int b) {
return a<b ? a : b;
}
bool BFS() {
p=u=1;
memset(viz,0,n+1);
q[1]=1;
viz[1]=1;
while(p<=u) {
if(q[p]==n) {
p++;
continue;
}
nod=q[p];
for(it=L[nod].begin();it!=L[nod].end();it++) {
if(viz[*it] || C[nod][*it]==F[nod][*it])
continue;
u++;
q[u]=*it;
viz[*it]=1;
T[*it]=nod;
}
p++;
}
return viz[n];
}
int main() {
ifstream f("critice.in");
ofstream g("critice.out");
f>>n>>m;
for(i=1;i<=m;i++) {
f>>x>>y>>z;
muchii[i][0]=x;
muchii[i][1]=y;
C[x][y]=z;
C[y][x]=z;
L[x].push_back(y);
L[y].push_back(x);
}
while( BFS() ) {
for(it=L[n].begin();it!=L[n].end();it++) {
if(!viz[*it] || C[*it][n]==F[*it][n])
continue;
T[n]=*it;
Min=INF;
for(i=n;i!=1;i=T[i])
Min=minim(Min,C[T[i]][i]-F[T[i]][i]);
if(Min==0)
continue;
for(i=n;i!=1;i=T[i]) {
F[T[i]][i]+=Min;
F[i][T[i]]-=Min;
}
}
}
p=u=1;
memset(vizn,0,n+1);
q[1]=n;
vizn[n]=1;
while(p<=u) {
nod=q[p];
for(it=L[nod].begin();it!=L[nod].end();it++) {
if(vizn[*it] || C[nod][*it]==-F[nod][*it])
continue;
u++;
q[u]=*it;
vizn[*it]=1;
T[*it]=nod;
}
p++;
}
for(i=1;i<=m;i++)
if((viz[muchii[i][0]] && vizn[muchii[i][1]]) || (viz[muchii[i][1]] && vizn[muchii[i][0]]))
sol[++k]=i;
g<<k<<"\n";
for(i=1;i<=k;i++)
g<<sol[i]<<"\n";
return 0;
}