Pagini recente » Profil petrasucana | Cod sursa (job #1203950) | Cod sursa (job #69998) | Cod sursa (job #1716316) | Cod sursa (job #2497906)
#include <iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int N=1005;
vector<int> gr[N];
int cap[N][N];
int flow[N][N];
int q[N*N];
int parent[N];
bool bfs(int n){
int st=0,dr=-1;
memset(parent,0,sizeof(parent));
q[++dr]=1;
parent[1]=1;
while(st<=dr){
int nod=q[st++];
if(nod==n)
return true;
for(int fiu:gr[nod]){
if(parent[fiu]==0 && cap[nod][fiu]-flow[nod][fiu]>0){
parent[fiu]=nod;
q[++dr]=fiu;
}
}
}
return false;
}
int drum(int n){
int mini=1<<30;
int tata=parent[n],nod=n;
while(nod!=1){
mini=min(mini,cap[tata][nod]-flow[tata][nod]);
nod=tata;
tata=parent[tata];
}
return mini;
}
void actualizare(int n,int flux){
int tata=parent[n],nod=n;
while(nod!=1){
flow[tata][nod]+=flux;
flow[nod][tata]-=flux;
nod=tata;
tata=parent[tata];
}
}
int muchii[10005][2];
bool vizs[N],vizd[N];
vector<int> sol;
int main()
{
FILE*fin,*fout;
fin=fopen("critice.in","r");
fout=fopen("critice.out","w");
int n,m;
fscanf(fin,"%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y,val;
fscanf(fin,"%d%d%d",&x,&y,&val);
muchii[i][0]=x;
muchii[i][1]=y;
cap[x][y]=val;
cap[y][x]=val;
gr[x].push_back(y);
gr[y].push_back(x);
}
while(bfs(n)){
int f=drum(n);
actualizare(n,f);
}
int st,dr;
st=0,dr=-1;
q[++dr]=1;
vizs[1]=true;
while(st<=dr){
int nod=q[st++];
for(auto i:gr[nod]){
if(!vizs[i] && cap[nod][i]-flow[nod][i]>0){
q[++dr]=i;
vizs[i]=true;
}
}
}
st=0,dr=-1;
q[++dr]=n;
vizd[n]=true;
while(st<=dr){
int nod=q[st++];
for(auto i:gr[nod]){
if(!vizd[i] && cap[i][nod]-flow[i][nod]>0){
q[++dr]=i;
vizd[i]=true;
}
}
}
for(int i=1;i<=m;i++){
int x=muchii[i][0],y=muchii[i][1];
if(((vizs[x] && vizd[y]) || (vizd[x] && vizs[y])) && (cap[x][y]-flow[x][y]==0 || cap[y][x]-flow[y][x]==0))
sol.push_back(i);
}
fprintf(fout,"%d\n",sol.size());
for(auto x:sol)
fprintf(fout,"%d\n",x);
return 0;
}