Pagini recente » Cod sursa (job #2662430) | Cod sursa (job #2518778) | Cod sursa (job #1994999) | Cod sursa (job #700555) | Cod sursa (job #2663179)
#include <fstream>
#include <bitset>
#include <deque>
#include <vector>
#define rmax 1000000
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n,m,i,j,k,c[1001][1001],flux[1001][1001],t[1001],nod,vec,v[2][1001],cnt,sol[10001];
vector <int> l[1001];
deque <int> q;
bitset <1001> f;
pair <int,int> edg[10001];
bool bfs(){
f.reset();
f[1]=1;
q.push_back(1);
while(!q.empty()){
nod=q.front();
q.pop_front();
for(int i=0;i<l[nod].size();i++){
vec=l[nod][i];
if(!f[vec] && c[nod][vec]>flux[nod][vec]){
f[vec]=1;
q.push_back(vec);
t[vec]=nod;
}
}
}
return f[n];
}
void bfs2(int nod, int x){
f.reset();
f[nod]=1;
q.push_back(nod);
v[x][nod]=1;
while(!q.empty()){
nod=q.front();
q.pop_front();
for(int i=0;i<l[nod].size();i++){
vec=l[nod][i];
if(!f[vec] && c[nod][vec]>max(flux[nod][vec],-flux[nod][vec])){
f[vec]=1;
q.push_back(vec);
v[x][vec]=1;
}
}
}
}
int main(){
fin>>n>>m;
for(k=1;k<=m;k++){
fin>>i>>j;
fin>>c[i][j];
c[j][i]=c[i][j];
l[i].push_back(j);
l[j].push_back(i);
edg[k]={i,j};
}
while(bfs()){
for(i=0;i<l[n].size();i++){
nod=l[n][i];
if(!f[nod] || c[nod][n]==flux[nod][n])
continue;
k=c[nod][n]-flux[nod][n];
while(nod!=1){
k=min(k,c[t[nod]][nod]-flux[t[nod]][nod]);
nod=t[nod];
}
nod=l[n][i];
flux[nod][n]+=k;
flux[n][nod]-=k;
while(nod!=1){
flux[t[nod]][nod]+=k;
flux[nod][t[nod]]-=k;
nod=t[nod];
}
}
}
bfs2(1,0);
bfs2(n,1);
for(k=1;k<=m;k++){
i=edg[k].first;
j=edg[k].second;
if( (v[0][i] && v[1][j]) || (v[1][i] && v[0][j]) )
sol[++cnt]=k;
}
fout<<cnt<<"\n";
for(i=1;i<=cnt;i++)
fout<<sol[i]<<"\n";
return 0;
}