Pagini recente » Cod sursa (job #888670) | Cod sursa (job #2631873) | Cod sursa (job #956435) | Cod sursa (job #163542) | Cod sursa (job #1516720)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define dim 1005
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n,i,c[dim][dim],f[dim][dim],viz[dim],nod,sol[dim*10],k,t[dim],m,x,y,z,minim,viz1[dim],viz2[dim],v1[dim*10],v2[dim*10];
queue <int>q;
vector <int> v[dim];
int bfs(){
while(!q.empty()){
q.pop();
}
memset(viz,0,sizeof(viz));
q.push(1);
viz[1]=1;
while(!q.empty()){
int nod=q.front();
if(nod==n){
return 1;
}
for(int i=0;i<v[nod].size();i++){
int vec=v[nod][i];
if(viz[vec]==0 && c[nod][vec]>f[nod][vec]){
t[vec]=nod;
q.push(vec);
viz[vec]=1;
}
}
q.pop();
}
return 0;
}
void bfs1(){
while(!q.empty()){
q.pop();
}
q.push(1);
viz1[1]=1;
while(!q.empty()){
int nod=q.front();
for(int i = 0 ; i < v[nod].size() ; i++){
int vecin = v[nod][i];
if(viz1[vecin] == 0 && c[nod][vecin]>f[nod][vecin] && c[nod][vecin]>f[vecin][nod]){
viz1[vecin] = 1;
q.push(vecin);
}
}
q.pop();
}
}
void bfs2(){
while(!q.empty()){
q.pop();
}
q.push(n);
viz2[n]=1;
while(!q.empty()){
int nod = q.front();
for(int i = 0 ; i < v[nod].size() ; i++){
int vecin = v[nod][i];
if(viz2[vecin]== 0 && c[nod][vecin]>f[nod][vecin] && c[nod][vecin]>f[vecin][nod]){
viz2[vecin]=1;
q.push(vecin);
}
}
q.pop();
}
}
int main(){
fin>>n>>m;
for(i=1;i<=m;i++){
fin>>x>>y>>z;
v[x].push_back(y);
v[y].push_back(x);
c[x][y]=z;
c[y][x]=z;
v1[i]=x;
v2[i]=y;
}
while(bfs()){
for(i=0;i<v[n].size();i++){
nod= v[n][i];
if(viz[nod]){
minim=c[nod][n]-f[nod][n];
while(minim!=0 && t[nod]!=0){
minim=min(minim,c[t[nod]][nod]-f[t[nod]][nod]);
nod=t[nod];
}
if(minim){
nod=v[n][i];
f[nod][n]+=minim;
f[n][nod]-=minim;
while(t[nod]!=0){
f[t[nod]][nod]+=minim;
f[nod][t[nod]]-=minim;
nod=t[nod];
}
}
}
}
}
bfs1();bfs2();
for(i=1;i<=m;i++){
x=v1[i];y=v2[i];
if(c[x][y]==f[x][y] || c[y][x]==f[y][x]){
if((viz1[x]==1 && viz2[y]==1) || (viz1[y]==1 && viz2[x]==1)){
sol[++k]=i;
}
}
}
fout<<k<<"\n";
for(i=1;i<=k;i++){
fout<<sol[i]<<"\n";
}
return 0;
}