Pagini recente » Cod sursa (job #1446002) | Cod sursa (job #1189783) | Cod sursa (job #422631) | Cod sursa (job #865119) | Cod sursa (job #1999561)
#include <cstdio>
#include <cstring>
#include <vector>
#define MAXN 1000
#define MAXM 10000
#define INF 1000000000
std::vector <int> G[MAXN+1];
int cap[MAXN+1][MAXN+1];
int flux[MAXN+1][MAXN+1];
int poz[MAXN+1][MAXN+1];
int from[MAXN+1];
int sol[MAXM+1];
bool viz[MAXN+1];
int Q[MAXN+1];
bool viz2[2][MAXN+1];
inline bool BFS1(int n){
int x,b,e,nod;
memset(viz,0,sizeof(viz));
memset(from,0,sizeof(from));
viz[1]=1;
Q[0]=1;
b=0;
e=1;
do{
nod=Q[b];
b++;
for(auto x:G[nod])
if(viz[x]==0&&cap[nod][x]>flux[nod][x]){
viz[x]=1;
from[x]=nod;
if(x<n)
Q[e++]=x;
}
}while(b<e);
return viz[n];
}
inline void BFS2(int s,int ind){
int x,b,e,nod;
Q[0]=s;
viz2[ind][s]=1;
b=0;
e=1;
do{
nod=Q[b];
b++;
for(auto x:G[nod])
if(viz2[ind][x]==0&&(cap[nod][x]>flux[nod][x]&&cap[x][nod]>flux[x][nod])){
viz2[ind][x]=1;
Q[e++]=x;
}
}while(b<e);
}
int main(){
FILE*fi,*fout;
int i,n,m,a,b,c,nod,min,ans,j,y;
fi=fopen("critice.in" ,"r");
fout=fopen("critice.out" ,"w");
fscanf(fi,"%d %d " ,&n,&m);
for(i=1;i<=m;i++){
fscanf(fi,"%d %d %d " ,&a,&b,&c);
poz[a][b]=i;
poz[b][a]=i;
G[a].push_back(b);
G[b].push_back(a);
cap[a][b]+=c;
cap[b][a]+=c;
}
while(BFS1(n)){
for(auto y:G[n])
if(viz[y]==1&&flux[y][n]<cap[y][n]){
from[n]=y;
nod=n;
min=INF;
while(from[nod]>0){
if(min>cap[from[nod]][nod]-flux[from[nod]][nod])
min=cap[from[nod]][nod]-flux[from[nod]][nod];
nod=from[nod];
}
nod=n;
while(from[nod]>0){
flux[from[nod]][nod]+=min;
flux[nod][from[nod]]-=min;
nod=from[nod];
}
}
}
BFS2(1,0);
BFS2(n,1);
ans=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(cap[i][j]>0&&flux[i][j]==cap[i][j]&&(viz2[0][i]+viz2[1][j]==2||viz2[1][i]+viz2[0][j]==2)){
ans++;
sol[ans]=poz[i][j];
}
fprintf(fout,"%d\n" ,ans);
for(i=1;i<=ans;i++)
fprintf(fout,"%d\n" ,sol[i]);
fclose(fi);
fclose(fout);
return 0;
}