Pagini recente » Cod sursa (job #2841731) | Cod sursa (job #1592928) | Cod sursa (job #2007654) | Cod sursa (job #632466) | Cod sursa (job #1172117)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
vector< pair<int,int> > L[1005];
vector< pair<int,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->first] || C[nod][it->first]==F[nod][it->first])
continue;
u++;
q[u]=it->first;
viz[it->first]=1;
T[it->first]=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(make_pair(y,1));
L[y].push_back(make_pair(x,0));
}
while( BFS() ) {
for(it=L[n].begin();it!=L[n].end();it++) {
if(!viz[it->first] || C[it->first][n]==F[it->first][n])
continue;
T[n]=it->first;
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->first] || C[nod][it->first]==F[nod][it->first])
continue;
u++;
q[u]=it->first;
vizn[it->first]=1;
T[it->first]=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;
}