Cod sursa(job #3305096)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 29 iulie 2025 21:06:42
Problema Algola Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
// Ilie "The-Winner" Dumitru
// Dumnezeu sa o ierte
#include<bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define err(...) fprintf(stderr, __VA_ARGS__)
using ll=long long;
constexpr int NMAX=50;
constexpr ll MOD=1000000007;

template<class F> constexpr F inf()
{ return std::numeric_limits<F>::max(); }
template<class F=ll> struct Dinic {
	struct Edge { int to, rev; F c, oc; F flow() {
		return std::max(oc-c, (F)0); } /* if you need flows */ };
	std::vector<int> lvl, ptr, q;
	std::vector<std::basic_string<Edge> > adj;
	Dinic(int n) : lvl(n), ptr(n), q(n), adj(n) {}
	void addEdge(int a, int b, F c, F rcap=0) {
		adj[a].push_back({b, sz(adj[b]), c, c});
		adj[b].push_back({a, sz(adj[a])-1, rcap, rcap}); }
	F dfs(int v, int t, F f) { if(v==t || !f) return f;
		for(int& i=ptr[v];i<sz(adj[v]);i++) { Edge& e=adj[v][i];
			if(lvl[e.to]==lvl[v]+1)
				if(F p=dfs(e.to, t, std::min(f, e.c))) {
					e.c-=p, adj[e.to][e.rev].c+=p; return p; }
		} return 0; }
	F calc(int s, int t) { F flow=0; q[0]=s;
		do { lvl=ptr=std::vector<int>(sz(q));
			int qi=0, qe=lvl[s]=1; while(qi<qe && !lvl[t]) {
				int v=q[qi++]; for(Edge e : adj[v])
					if(!lvl[e.to] && e.c)
						q[qe++]=e.to, lvl[e.to]=lvl[v]+1; }
			while(F p=dfs(s, t, inf<F>())) flow+=p; } while(lvl[t]);
		return flow; }
		bool leftOfMinCut(int a) { return lvl[a]!=0; } };

struct edge
{
	int u, v, c;
};

int N, M;
int src[NMAX];
std::vector<edge> E;

bool doable(int days)
{
	int s=N*(days+1), i, j, sum=0;
	Dinic D(s+1);

	for(i=0;i<N;++i)
		if(src[i])
		{
			D.addEdge(s, i, src[i]);
			sum+=src[i];
		}
	for(i=0;i<days;++i)
	{
		for(j=0;j<N;++j)
			D.addEdge(i*N+j, i*N+N+j, 50);
		for(j=0;j<M;++j)
		{
			D.addEdge(i*N+E[j].u, i*N+N+E[j].v, E[j].c);
			D.addEdge(i*N+E[j].v, i*N+N+E[j].u, E[j].c);
		}
	}

	return D.calc(s, N*days)==sum;
}

int main()
{
	FILE* f=fopen("algola.in", "r"), *g=fopen("algola.out", "w");
	int a, b, c, i, l, r, mid;

	fscanf(f, "%d%d", &N, &M);
	for(i=0;i<N;++i)
		fscanf(f, "%d", src+i);
	for(i=0;i<M;++i)
	{
		fscanf(f, "%d%d%d", &a, &b, &c);
		E.push_back({--a, --b, c});
	}

	for(l=-1, r=255;r-l>1;)
	{
		mid=l+((r-l)>>1);
		if(doable(mid))
			r=mid;
		else
			l=mid;
	}

	fprintf(g, "%d\n", r);

	fclose(f);
	fclose(g);
	return 0;
}