Pagini recente » Cod sursa (job #1579730) | Cod sursa (job #733932) | Cod sursa (job #1466817) | Cod sursa (job #455942) | Cod sursa (job #565899)
Cod sursa(job #565899)
#include<fstream>
#include<vector>
#include<string.h>
#define MAX 1001
#define INF 0x3f3f3f3f
using namespace std;
vector<int> G[MAX];
int C[MAX][MAX], F[MAX][MAX], T[MAX],viz[MAX],N,M,V[2][10001],k;
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;
C[x][y] = C[y][x] = c;
G[x].push_back(y);
G[y].push_back(x);
}
f.close();
}
int bf()
{
int Q[MAX],p,u,nod;
p = u = 1;
Q[p] = 1;
memset(viz,0,sizeof(viz));
viz[1] = 1;
while(p<=u)
{
nod = Q[p++];
if(nod!=N)
for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();++it)
if(!viz[*it] && C[nod][*it] > F[nod][*it])
{
Q[++u] = *it;
T[*it] = nod;
viz[*it] = 1;
}
}
return viz[N];
}
int minim(int a,int b)
{
if(a<=b)return a;
return b;
}
void bf2()
{
int p,u,Q[MAX],nod;
memset(T,0,sizeof(T));
p = u = 1;
T[1] = 1;
T[N] = N;
Q[p] = 1;
while(p<=u)
{
nod = Q[p++];
for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();++it)
if(!T[*it] && C[nod][*it] > F[nod][*it])
{
T[*it] = T[nod];
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(!T[*it] && C[nod][*it] > abs(F[nod][*it]))
{
T[*it] = T[nod];
Q[++u] = *it;
}
else if(C[nod][*it] == abs(F[nod][*it]) && T[*it] == 1 && T[nod] == N)++k;
}
}
int main()
{
read();
int r=INF,i;
while(bf())
{
for(vector<int>::iterator it = G[N].begin();it!=G[N].end();++it)
if(viz[*it] && C[*it][N] > F[*it][N])
{
T[N] = *it;
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];
}
}
}
bf2();
ofstream g("critice.out");
g<<k<<"\n";
int x,y;
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;
}