Pagini recente » Cod sursa (job #1904048) | Cod sursa (job #531290) | Cod sursa (job #2169769) | Cod sursa (job #2178876) | Cod sursa (job #1602145)
#include<cstdio>
#include<bitset>
#include<queue>
#include<vector>
#include<algorithm>
#define N 1000
#define M 10000
using namespace std;
int lst[N+1];
int urm[2*M+1];
int vecin[2*M+1];
int c[N+1][N+1];
int f[N+1][N+1];
int n;
bitset<N+1> viz;
bitset<N+1> viz2;
int tata[N+1];
int R;
int minim(int a,int b){
return (a<b) ? a : b;
}
void bfsinv(){
viz2.reset();
int nod,i,p;
queue<int> q;
q.push(n);
viz2.set(n);
while(!q.empty()){
nod=q.front();
//if (nod==n) break ;
q.pop();
p=lst[nod];
while(p!=0){
i=vecin[p];
if (c[i][nod]-f[i][nod]>0 &&viz2[i]==false){
viz2.set(i);
tata[i]=nod;
q.push(i);
//if (i==n) break ;
}
p=urm[p];
}
}
}
bool bfs(){
viz.reset();
int nod,i,p;
queue<int> q;
q.push(1);
viz.set(1);
while(!q.empty()){
nod=q.front();
if (nod==n) break ;
q.pop();
p=lst[nod];
while(p!=0){
i=vecin[p];
if (c[nod][i]-f[nod][i]>0 &&viz[i]==false){
viz.set(i);
tata[i]=nod;
q.push(i);
if (i==n) break ;
}
p=urm[p];
}
}
return viz[n];
}
void solve(){
int i,min;
while(bfs()){
for(i=1;i<n;i++)
if (c[i][n]-f[i][n]!=0 &&viz[i]==true){
tata[n]=i;
int nod=n;
min=c[tata[nod]][nod]-f[tata[nod]][nod];
while(nod!=1){
min=minim(min,c[tata[nod]][nod]-f[tata[nod]][nod]);
nod=tata[nod];
}
R+=min;
nod=n;
while(nod!=1){
f[tata[nod]][nod]+=min;
f[nod][tata[nod]]-=min;
nod=tata[nod];
}
}
}
}
void adauga(int x,int y,int i){
vecin[i*2-1]=y;
urm[i*2-1]=lst[x];
lst[x]=i*2-1;
vecin[i*2]=x;
urm[i*2]=lst[y];
lst[y]=i*2;
}
int main(){
freopen ("critice.in","r",stdin);
freopen ("critice.out","w",stdout);
int m,i,x,y;
scanf ("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf ("%d%d",&x,&y);
scanf ("%d",&c[x][y]);
c[y][x]=c[x][y];
adauga(x,y,i);
}
solve();
vector<int> sol;
bfs();
bfsinv();
for(i=1;i<=n;i++){
x=lst[i];
while(x!=0){
if (vecin[x]!=0){
if (viz[i]==1 &&viz2[vecin[x]]==1 &&c[i][vecin[x]]==f[i][vecin[x]]){
sol.push_back((x+1)/2);
}
}
x=urm[x];
}
}
sort(sol.begin(),sol.end());
printf ("%d\n", sol.size());
for(i=0;i<sol.size();i++)
printf ("%d\n",sol[i]);
return 0;
}