Pagini recente » Cod sursa (job #2087973) | Cod sursa (job #2578995) | Cod sursa (job #2544914) | Cod sursa (job #880368) | Cod sursa (job #2521036)
#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,(n+1)*sizeof(int));
q[++dr]=1;
parent[1]=1;
while(st<=dr){
int nod=q[st++];
for(int fiu:gr[nod]){
if(parent[fiu]==0 && cap[nod][fiu]-flow[nod][fiu]>0){
parent[fiu]=nod;
q[++dr]=fiu;
}
}
}
if(parent[n]==0)
return false;
return true;
}
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;
FILE*fin,*fout;
const int SIZE=1<<10;
char buf[SIZE];
int ptr=SIZE;
char adv(){
if(ptr==SIZE){
fread(buf,sizeof(char),SIZE,fin);
ptr=0;
}
return buf[ptr++];
}
int read(){
int x=0;
char c=adv();
while(!(c>='0' && c<='9'))
c=adv();
while(c>='0' && c<='9'){
x=x*10+c-'0';
c=adv();
}
return x;
}
int main()
{
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;
x=read();
y=read();
val=read();
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)){
for(int i=1;i<n;i++){
if(cap[i][n]-flow[i][n]>0){
parent[n]=i;
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;
}