Submission #385889

#TimeUsernameProblemLanguageResultExecution timeMemory
385889alireza_kavianiFriend (IOI14_friend)C++11
58 / 100
232 ms65540 KiB
#include <bits/stdc++.h>
#include "friend.h"
using namespace std;

#define all(x)		(x).begin() , (x).end()
#define SZ(x)		int(x.size())

const int MAXN = 1e5 + 10;
const int MOD = 1e9 + 7;

struct MaxFlow{
	struct Edge{
		int from , to , flow , cap;
	};
	int s , t;
	vector<int> ptr , dist;
	vector<Edge> E;
	vector<vector<int>> adj;
	queue<int> Q;
	void init(int n){
		E.clear(); adj.clear(); ptr.clear(); dist.clear();
		adj.resize(n); ptr.resize(n); dist.resize(n);
	}
	void add(int v , int u , int cap){
		adj[v].push_back(SZ(E)); E.push_back({v , u , 0 , cap});
		adj[u].push_back(SZ(E)); E.push_back({u , v , 0 , 0});
	}
	int BFS(){
		fill(all(dist) , MOD);
		fill(all(ptr) , 0);
		dist[s] = 0;
		queue<int> q; q.push(s);
		while(!q.empty()){
			int v = q.front(); q.pop();
			for(int i : adj[v]){
				int u = E[i].to;
				if(E[i].flow == E[i].cap)	continue;
				if(dist[u] == MOD){
					dist[u] = dist[v] + 1;
					q.push(u);
				}
			}
		}
		return (dist[t] < MOD);
	}
	int DFS(int v , int w){
		if(v == t)	return w;
		int ans = 0;
		for( ; ptr[v] < SZ(adj[v]) ; ptr[v]++){
			int ind = adj[v][ptr[v]] , u = E[ind].to;
			if(E[ind].flow == E[ind].cap || dist[u] != dist[v] + 1)	continue;
			int cur = min(w - ans , E[ind].cap - E[ind].flow);
			int val = DFS(u , cur);
			ans += val; E[ind].flow += val; E[ind ^ 1].flow -= val;
			if(ans == w)	break;
		}
		return ans;
	}
	int flow(int v , int u){
		s = v; t = u; int ans = 0;
		while(BFS())	ans += DFS(s , MOD);
		return ans;
	}
} flow;

int col[MAXN];
vector<int> adj[MAXN];

int findSample(int n,int confidence[],int host[],int protocol[]){
	/*flow.init(10);
	flow.add(0 , 1 , 10);
	flow.add(0 , 2 , 10);
	flow.add(1 , 3 , 10);
	flow.add(2 , 3 , 7);
	flow.add(3 , 4 , 8);
	cout << flow.flow(0 , 4) << endl;*/
	int mx = 0 , sum = 0 , flag = 0;
	for(int i = 0 ; i < n ; i++){
		sum += confidence[i];
		mx = max(mx , confidence[i]);
	}
	for(int i = 1 ; i < n ; i++){
		protocol[i]++;
		if(protocol[i] & 2){
			for(int j : adj[host[i]]){
				adj[i].push_back(j);
				adj[j].push_back(i);
			}
			col[i] = col[host[i]];
		}
		if(protocol[i] & 1){
			adj[i].push_back(host[i]);
			adj[host[i]].push_back(i);
			col[i] = (col[host[i]] ^ 1);
		}
		if(protocol[i] == 3){
			flag = 1;
		}
	}
	if(flag)	return mx;
	flow.init(n + 2);
	for(int i = 0 ; i < n ; i++){
		if(col[i] == 0){
			flow.add(0 , i + 1 , confidence[i]);
			for(int j : adj[i])	flow.add(i + 1 , j + 1 , MOD);
		}
		else	flow.add(i + 1 , n + 1 , confidence[i]);
	}
	return sum - flow.flow(0 , n + 1);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...