Pagini recente » Cod sursa (job #1501336) | Cod sursa (job #1928223) | Cod sursa (job #1389281) | Cod sursa (job #938008) | Cod sursa (job #565877)
Cod sursa(job #565877)
#include<fstream>
#include<string.h>
#include<vector>
#define MAX 1001
#define INF 0x3f3f3f
using namespace std;
vector<int> G[MAX];
int N,M,C[MAX][MAX],F[MAX][MAX],T[MAX],viz[MAX],k,V[2][MAX*10];
void read()
{
ifstream f("critice.in");
f>>N>>M;
int i,x,y,c;
for(i=1;i<=M;++i)
{
f>>x>>y>>c;
V[0][i] = x;
V[1][i] = y;
G[x].push_back(y);
G[y].push_back(x);
C[x][y] = C[y][x] = c;
}
f.close();
}
int abs(int x)
{
if(x<0)return x*(-1);
return x;
}
int bf()
{
int p,u,Q[MAX],nod;
p = u = 1;
Q[p] = 1;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
while(p<=u)
{
nod = Q[p++];
if(nod == N)continue;
for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();++it)
{
if(viz[*it] || C[*it][nod] <= abs(F[*it][nod]))continue;
Q[++u] = *it;
viz[*it] = 1;
T[*it] = nod;
}
}
return viz[N];
}
void bf2()
{
int p,u,Q[MAX],nod;
memset(T,0,sizeof(T));
memset(viz,0,sizeof(T));
p = u = 1;
Q[p] = 1;
T[1] = 1;
T[N] = N;
viz[1] = 1;
viz[N] = 1;
while(p<=u)
{
nod = Q[p++];
for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();++it)
{
if(viz[*it] || C[nod][*it] == abs(F[nod][*it]))continue;
T[*it] = T[nod];
viz[*it] = 1;
Q[++u] = *it;
}
}
p = u = 1;
Q[p] = N;
while(p<=u)
{
nod = Q[p++];
for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();++it)
{
if(viz[*it] || C[nod][*it] == abs(F[nod][*it]))
{
if(C[nod][*it] == abs(F[nod][*it]) && T[*it] == 1 && T[nod] == N)
++k;
continue;
}
viz[*it] = 1;
T[*it] = T[nod];
Q[++u] = *it;
}
}
}
int minim(int a,int b)
{
if(a<=b)return a;
return b;
}
int main()
{
read();
int flux=0,r,i,x,y;
while(bf())
{
for(vector<int>::iterator it = G[N].begin();it!=G[N].end();++it)
{
if(!viz[*it] || C[*it][N] == F[*it][N])continue;
i = *it;
T[N] = i;
i = N;
r = INF;
while(i!=1)
{
r = minim(r, C[T[i]][i] - F[T[i]][i]);
i = T[i];
}
if(r == 0)continue;
i = N;
while(i!=1)
{
F[T[i]][i] += r;
F[i][T[i]] -= r;
i = T[i];
}
flux+=r;
}
}
bf2();
ofstream g("critice.out");
g<<k<<"\n";
for(i=1;i<=M;++i)
{
x = V[0][i];
y = V[1][i];
if(C[x][y] == abs(F[x][y]) && (T[x]==1&&T[y]==N || T[x]==N&&T[y]==1))
g<<i<<"\n";
}
g.close();
return 0;
}