Pagini recente » Cod sursa (job #788149) | Cod sursa (job #494918) | Cod sursa (job #577754) | Cod sursa (job #2697957) | Cod sursa (job #2772802)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n,i,m,T[1010],F,a[1005][1005],S[10010],nr,flux[1005][1005],flux2[1005][1005],C[1005][1005],x,y,z;
int crt_verif1,crt_verif2,verif[1005][1005],ant,crt;
pair<int,int> v[10005];
queue<int> q;
bitset<1005> f;
vector<int> L[1005];
int bfs(){
f.reset();
q.push(1);
f[1]=1;
while(!q.empty()){
int nod=q.front();
for(int i=0;i<L[nod].size();i++){
int vec=L[nod][i];
if(!f[vec]&&C[nod][vec]-flux[nod][vec]>0){
q.push(vec);
T[vec]=nod;
f[vec]=1;
}
}
q.pop();
}
return f[n];
}
void flow(){
int sol=0;
while(bfs()){
for(int i=0;i<L[n].size();i++){
int nod=L[n][i];
if(C[nod][n]-flux[nod][n]>0&&f[nod]){
int vec=nod;
int minim=C[nod][n]-flux[nod][n];
while(nod!=1){
minim=min(minim,C[T[nod]][nod]-flux[T[nod]][nod]);
nod=T[nod];
}
nod=vec;
flux[nod][n]+=minim;
flux[n][nod]-=minim;
sol+=minim;
while(nod!=1){
flux[T[nod]][nod]+=minim;
flux[nod][T[nod]]-=minim;
nod=T[nod];
}
}
}
}
}
void bfs1(){
f.reset();
q.push(1);
int ok=0;
f[1]=1;
while(!q.empty()){
int nod=q.front();
for(int i=0;i<L[nod].size();i++){
int vec=L[nod][i];
if(!f[vec]){
if(C[nod][vec]-flux[nod][vec]>0){
q.push(vec);
}else{
if(!verif[nod][vec]&&!ok&&!verif[vec][nod]){
verif[nod][vec]=ok=verif[vec][nod]=1;
crt++;
q.push(vec);
crt_verif1=vec;
crt_verif2=nod;
}
}
f[vec]=1;
}else{
if(C[nod][vec]-flux[nod][vec]<=0){
if(!verif[nod][vec]&&!ok&&!verif[vec][nod]){
verif[nod][vec]=ok=verif[vec][nod]=1;
crt++;
crt_verif1=vec;
crt_verif2=nod;
}
}
}
}
q.pop();
}
}
int main(){
fin>>n>>m;
for(i=1;i<=m;i++){
fin>>x>>y>>z;
L[x].push_back(y);
L[y].push_back(x);
C[x][y]=C[y][x]=z;
a[x][y]=a[y][x]=i;
}
flow();
while(true){
bfs1();
if(crt==ant)
break;
if(f[n])
S[++nr]=a[crt_verif2][crt_verif1];
ant=crt;
}
sort(S+1,S+nr+1);
fout<<nr<<"\n";
for(i=1;i<=nr;i++)
fout<<S[i]<<"\n";
return 0;
}