Pagini recente » Borderou de evaluare (job #2496317) | Cod sursa (job #400993) | Cod sursa (job #1873601) | Cod sursa (job #2577169) | Cod sursa (job #562627)
Cod sursa(job #562627)
#include<cstdio>
#include<vector>
#include<queue>
#define Nmax 1024
#define Mmax 10010
using namespace std;
vector <int> a[Nmax];
pair<int,int> m[Nmax];
vector <int> sol;
queue <int> c;
int N,M,fx[Nmax][Nmax],cp[Nmax][Nmax],viz[Nmax],t[Nmax];
bool viz_sus[Nmax],viz_jos[Nmax];
int bf(){
memset(viz,0,sizeof(viz));
while(!c.empty())
c.pop();
c.push(1);
viz[1]=1;
while(!c.empty()){
int nod=c.front();
c.pop();
for(unsigned int i=0;i<a[nod].size();++i)
if(!viz[a[nod][i]] && cp[nod][a[nod][i]] > fx[nod][a[nod][i]]){
if(a[nod][i]==N)
return 1;
viz[a[nod][i]]=1;
t[a[nod][i]]=nod;
c.push(a[nod][i]);
}
}
return 0;
}
void flux(){
while(bf()){
for(vector <int>::iterator i=a[N].begin();i!=a[N].end();++i)
if(viz[*i] && fx[*i][N] < cp[*i][N]){
int fmn=10000;
t[N]=*i;
for(int nod=N;nod!=1;nod=t[nod])
fmn=min(fmn, cp[t[nod]][nod]-fx[t[nod]][nod]);
if(fmn!=0)
for(int nod=N;nod!=1;nod=t[nod])
fx[t[nod]][nod]+=fmn,
fx[nod][t[nod]]-=fmn;
}
}
}
void df_1_n(int nod){
viz_sus[nod]=1;
for(vector<int>::iterator it=a[nod].begin();it!=a[nod].end();++it)
if(!viz_sus[*it] && fx[nod][*it] < cp[nod][*it])
df_1_n(*it);
}
void df_n_1(int nod){
viz_jos[nod]=1;
for(vector<int>::iterator it=a[nod].begin();it!=a[nod].end();++it)
if(!viz_jos[*it] && fx[*it][nod] < cp[*it][nod])
df_n_1(*it);
}
int main(){
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=1;i<=M;++i){
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
cp[x][y]=c;
cp[y][x]=c;
m[i]=make_pair(x,y);
a[x].push_back(y);
a[y].push_back(x);
}
flux();
df_1_n(1);
df_n_1(N);
for(int i=1;i<=M;++i){
if(viz_jos[m[i].first]&&viz_sus[m[i].second] || viz_jos[m[i].second]&&viz_sus[m[i].first] )
if(abs(fx[m[i].first][m[i].second]) == cp[m[i].first][m[i].second])
sol.push_back(i);
}
printf("%d\n",sol.size());
for(size_t i=0;i<sol.size();++i)
printf("%d\n",sol[i]);
return 0;
}