Pagini recente » Cod sursa (job #1495601) | Cod sursa (job #1938666) | Cod sursa (job #574126) | Cod sursa (job #2717218) | Cod sursa (job #914196)
Cod sursa(job #914196)
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#define mp make_pair
#define pb push_back
#define x first
#define c second
#define MAX 5005
#define INF 100
using namespace std;
int N, M, S, D, T, sum;
vector<int> V[MAX];
vector< pair<int, int> > G[MAX];
char C[MAX][MAX], F[MAX][MAX];
bool viz[MAX];
int dad[MAX];
void citire() {
ifstream in("algola.in");
in>>N>>M;
S = 0;
for(int i = 1, A; i <= N; i++) {
in>>A;
sum += A;
V[S].pb(i);
V[i].pb(S);
C[S][i] = A;
}
for(int i = 1, A, B, C; i <= M; i++) {
in>>A>>B>>C;
G[A].pb(mp(B, C));
G[B].pb(mp(A, C));
} in.close();
}
void buildGraph() {
for(int i = 1; i <= N; i++) {
int nod = (T - 1) * N + i;
for(size_t j = 0; j < G[i].size(); j++) {
int dest = T * N + G[i][j].x, cap = G[i][j].c;
V[nod].pb(dest);
V[dest].pb(nod);
C[nod][dest] = cap;
}
V[nod].pb(nod + N);
V[nod + N].pb(nod);
C[nod][nod + N] = INF;
}
}
bool bfs() {
queue<int> Q;
memset(viz, 0, sizeof(viz));
Q.push(S); viz[S] = true;
while(!Q.empty()) {
int nod = Q.front(); Q.pop();
for(size_t i = 0; i < V[nod].size(); i++) {
int dest = V[nod][i];
if(C[nod][dest] == F[nod][dest] || viz[dest] || dest > D)
continue;
viz[dest] = true;
dad[dest] = nod;
if(dest == D) return true;
Q.push(dest);
}
}
return false;
}
void flux() {
int ans = 0;
while(bfs()) {
int val = INF, nod = D;
while(nod != S) {
val = min(val, C[dad[nod]][nod] - F[dad[nod]][nod]);
nod = dad[nod];
}
nod = D;
while(nod != S) {
F[dad[nod]][nod] += val;
F[nod][dad[nod]] -= val;
nod = dad[nod];
}
sum -= val;
}
}
void afisare() {
ofstream out("algola.out"); out<<--T; out.close();
}
int main()
{
citire();
bool sol = false;
S = 0;
for(T = 1; !sol; T++) {
buildGraph();
D = T * N + 1;
flux();
if(!sum)
sol = true;
}
afisare();
return 0;
}