Pagini recente » Cod sursa (job #72578) | Cod sursa (job #1577855) | Cod sursa (job #664188) | Cod sursa (job #2671398) | Cod sursa (job #1161619)
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#define NMax 1001
#define ffx mu[i].first
#define ssy mu[i].second
using namespace std;
int n;
int flux[NMax][NMax];
int cap[NMax][NMax];
vector <int> grr[NMax];
vector <int> sol;
vector <pair<int,int> > mu;
int tata[NMax];
queue <int> q;
bool vizs[NMax];
bool vizd[NMax];
bool bfs(int s)
{
int i;
for(i=1;i<=n;i++)
tata[i]=0;
tata[s]=s;
q.push(s);
while(!q.empty())
{
s=q.front();
q.pop();
if(s!=n)
{
for(i=0;i<grr[s].size();i++)
if((flux[s][grr[s][i]]!=cap[s][grr[s][i]])&&(!tata[grr[s][i]]))
{
tata[grr[s][i]]=s;
q.push(grr[s][i]);
}
}
}
if(tata[n])
return 1;
return 0;
}
bool saturata(int x, int y)
{
if(flux[x][y]==cap[x][y])
return 1;
if(flux[y][x]==cap[x][y])
return 1;
return 0;
}
void dfss(int s)
{
int i;
vizs[s]=1;
for(i=0;i<grr[s].size();i++)
if(!saturata(s,grr[s][i]) && !vizs[grr[s][i]])
dfss(grr[s][i]);
}
void dfsd(int s)
{
int i;
vizd[s]=1;
for(i=0;i<grr[s].size();i++)
if(!saturata(s,grr[s][i]) && !vizd[grr[s][i]])
dfsd(grr[s][i]);
}
int main()
{
int m;
int i;
int x,y,c;
int fmin,vf;
//int flow=0;
ifstream f("critice.in");
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>x>>y>>c;
cap[x][y]+=c;
cap[y][x]+=c;
grr[x].push_back(y);
grr[y].push_back(x);
mu.push_back(make_pair(x,y));
}
f.close();
while(bfs(1))
{
for(i=0;i<grr[n].size();i++)
if((flux[grr[n][i]][n]!=cap[grr[n][i]][n])&&(tata[grr[n][i]]))
{
vf=grr[n][i];
tata[n]=vf;
fmin=cap[vf][n]-flux[vf][n];
while(vf!=1)
{
fmin=min(fmin,cap[tata[vf]][vf]-flux[tata[vf]][vf]);
vf=tata[vf];
}
if(fmin>0)
{
vf=n;
while(vf!=1)
{
flux[tata[vf]][vf]+=fmin;
flux[vf][tata[vf]]-=fmin;
vf=tata[vf];
}
// flow+=fmin;
}
}
}
dfss(1);
dfsd(n);
for(i=0;i<mu.size();i++)
if(saturata(ffx,ssy)&&((vizs[ffx]&&vizd[ssy])||(vizd[ffx]&&vizs[ssy])))
sol.push_back(i);
ofstream g("critice.out");
g<<sol.size()<<'\n';
for(i=0;i<sol.size();i++)
g<<sol[i]+1<<"\n";
g<<'\n';
g.close();
return 0;
}