Pagini recente » Cod sursa (job #3183411) | Cod sursa (job #768274) | Cod sursa (job #778207) | Cod sursa (job #331016) | Cod sursa (job #964293)
Cod sursa(job #964293)
#include<fstream>
#include<vector>
#include<cstring>
#include<algorithm>
#define pb push_back
using namespace std;
const int NMAX=1003;
const int INF=0x3f3f3f3f;
vector<int> G[NMAX],sol;
vector<int>::iterator it;
int C[NMAX][NMAX],N,M,X1[10003],Y1[10003];
int T[NMAX],CD[NMAX];
bool viz[NMAX],viz2[NMAX];
void update(){
int nod,minn=INF;
nod=N;
while(T[nod]!=-1){
if(C[T[nod]][nod]<minn)minn=C[T[nod]][nod];
nod=T[nod];
}
nod=N;
while(T[nod]!=-1){
C[T[nod]][nod]-=minn;
C[nod][T[nod]]+=minn;
nod=T[nod];
}
}
int bfs(){
int ok=0,V,i;
memset(viz,0,sizeof(viz));
viz[1]=1; T[1]=-1;
CD[0]=CD[1]=1;
for(i=1;i<=CD[0];++i){
V=CD[i];
for(it=G[V].begin();it!=G[V].end();++it)
if(!viz[*it] && C[V][*it]>0){
if((*it)!=N) CD[++CD[0]]=(*it);
T[*it]=V;
viz[*it]=1;
}
if(viz[N]){ ok=1; update(); viz[N]=0; }
}
return ok;
}
int main(){
ifstream cin("critice.in");
ofstream cout("critice.out");
int i,x,y,z;
cin>>N>>M;
for(i=1;i<=M;++i){
cin>>x>>y>>z;
G[x].pb(y);
G[y].pb(x);
C[x][y]=z;
C[y][x]=z;
X1[i]=x; Y1[i]=y;
}
while(bfs());
int nod=1;
memset(viz,0,sizeof(viz));
CD[0]=CD[1]=1; viz[1]=1;
for(i=0;i<=CD[0];++i){
nod=CD[i];
for(it=G[nod].begin();it!=G[nod].end();++it)
if(!viz[*it] && C[nod][*it]>0)
{
CD[++CD[0]]=(*it);
viz[*it]=1;
}
}
memset(viz2,0,sizeof(viz2));
nod=N; CD[0]=1; CD[1]=N; viz2[N]=1;
for(i=1;i<=CD[0];++i)
{
nod=CD[i];
for(it=G[nod].begin();it!=G[nod].end();++it)
if(!viz2[*it] && C[nod][*it]>0){
CD[++CD[0]]=(*it);
viz2[*it]=1;
}
}
for(i=1;i<=M;++i)
if((viz[X1[i]] && viz2[Y1[i]] && !C[X1[i]][Y1[i]]) || (viz2[X1[i]] && viz[Y1[i]] && !C[Y1[i]][X1[i]]))
sol.pb(i);
cout<<sol.size()<<'\n';
for(it=sol.begin();it!=sol.end();++it)cout<<(*it)<<'\n';
return 0;
}