Pagini recente » Cod sursa (job #792760) | Cod sursa (job #2340064) | Cod sursa (job #1574724) | Cod sursa (job #2692648) | Cod sursa (job #1726954)
#include<iostream>
#include<fstream>
#include<cstring>
#define MMAX 10004
#define NMAX 1003
#include<vector>
using namespace std;
int pred[NMAX],q[NMAX],cap[NMAX][NMAX],f[NMAX][NMAX],viz[3][NMAX];
vector<pair<int,int> > g;
vector<int> sol,v[NMAX];
void bfs(int s, int t)
{
int i;
int start,stop;
start=1;
q[start]=s;
stop=1;
start=0;
pred[s]=-2;
while(start<stop&&q[start]!=t)
{
start++;
int nod=q[start];
for(i=0; i<v[nod].size(); i++)
{
if(pred[v[nod][i]]==-1&&f[nod][v[nod][i]]!=cap[nod][v[nod][i]])
{
pred[v[nod][i]]=nod;
stop++;
q[stop]=v[nod][i];
}
}
}
}
void flux(int n,int s,int t)
{
int ss=0;
while(1)
{
memset(pred,-1,sizeof(pred));
bfs(1,t);
if(pred[t]==-1)
break;
int capmin=0;
for(int nod=1; nod<=n; nod++)
{
if(pred[nod]!=-1&&cap[nod][t]!=f[nod][t])
{
capmin=cap[nod][t]-f[nod][t];
// cout<<nod<<" "<<t<<"\n";
for(int vv=nod,u=pred[vv]; u>0; vv=u,u=pred[vv])
{
// cout<<vv<<" "<<u<<"\n";
capmin=min(capmin,cap[u][vv]-f[u][vv]);
}
if(!capmin)
continue;
f[nod][t]+=capmin;
f[t][nod]-=capmin;
for(int vv=nod,u=pred[vv]; u>0; vv=u,u=pred[vv])
{
f[u][vv]+=capmin;
f[vv][u]-=capmin;
}
}
cout<<capmin<<"\n";
capmin=0;
}
}
// cout<<"flux="<<ss;
}
void dfs(int x, int add)
{
viz[add][x]=1;
for(int i=0; i<v[x].size(); i++)
{
if(viz[add][v[x][i]]==0)
dfs(v[x][i],add);
}
}
int main()
{
int i,n,m,a,b,cost;
ifstream cin("critice.in");
ofstream cout("critice.out");
cin>>n>>m;
for(i=1; i<=m; i++)
{
cin>>a>>b>>cost;
cap[a][b]=cap[b][a]=cost;
g.push_back(make_pair(a,b));
v[a].push_back(b);
v[b].push_back(a);
}
flux(n,1,n);
dfs(1,1);
dfs(n,2);
for(i=0; i<m; i++)
{
if(f[g[i].first][g[i].second]==cap[g[i].first][g[i].second]&&viz[1][g[i].first]==1&&viz[2][g[i].second]==1)
sol.push_back(i+1);
else
{
swap(g[i].first,g[i].second);
if(f[g[i].first][g[i].second]==cap[g[i].first][g[i].second]&&viz[1][g[i].first]==1&&viz[2][g[i].second]==1)
sol.push_back(i+1);
}
}
cout<<sol.size()<<"\n";
for(i=0; i<sol.size(); i++)
cout<<sol[i]<<"\n";
return 0;
}