Pagini recente » Cod sursa (job #174286) | Cod sursa (job #1309588) | Cod sursa (job #460755) | Cod sursa (job #2418203) | Cod sursa (job #964159)
Cod sursa(job #964159)
#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;
int C[NMAX][NMAX],N,M,X1[10003],Y1[10003],Z1[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,j;
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(j=0;j<G[V].size();++j)
if(!viz[G[V][j]] && C[V][G[V][j]]>0){
if(G[V][j]!=N) CD[++CD[0]]=G[V][j];
T[G[V][j]]=V;
viz[G[V][j]]=1;
}
if(viz[N]){ ok=1; update(); viz[N]=0; }
}
return ok;
}
int main(){
ifstream cin("critice.in");
ofstream cout("critice.out");
int i,j,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; Z1[i]=z;
}
while(bfs());
int nod=1,V;
memset(viz,0,sizeof(viz));
CD[0]=CD[1]=1; viz[1]=1;
for(i=0;i<=CD[0];++i){
nod=CD[i];
for(j=0;j<G[nod].size();++j)
{
V=G[nod][j];
if(!viz[V] && C[nod][V]>0)
{
CD[++CD[0]]=V;
viz[V]=1;
}
}
}
nod=N; viz2[N]=1;
memset(viz2,0,sizeof(viz2));
CD[0]=1; CD[1]=N;
for(i=1;i<=CD[0];++i)
{
nod=CD[i];
for(j=0;j<G[nod].size();++j)
{
V=G[nod][j];
if(!viz2[V] && C[nod][V]>0){
CD[++CD[0]]=V;
viz2[V]=1;
}
}
}
for(i=1;i<=M;++i)
if(C[X1[i]][Y1[i]]==0)
if((viz[X1[i]] && viz2[Y1[i]]) || (viz2[X1[i]] && viz[Y1[i]]))
sol.pb(i);
cout<<sol.size()<<'\n';
for(i=0;i<sol.size();++i)cout<<sol[i]<<'\n';
return 0;
}