Submission #1017390

#TimeUsernameProblemLanguageResultExecution timeMemory
1017390Ice_manFriend (IOI14_friend)C++14
23 / 100
1 ms2908 KiB
/** ____ ____ ____ __________________ ____ ____ ____ ||I || ||c || ||e || || || ||M || ||a || ||n || ||__|| ||__|| ||__|| ||________________|| ||__|| ||__|| ||__|| |/__\| |/__\| |/__\| |/________________\| |/__\| |/__\| |/__\| */ #include <iostream> #include <chrono> #include <vector> #include <algorithm> #include <assert.h> #include <queue> #include "friend.h" #define maxn 1005 #define maxlog 20 #define INF 1000000010 #define LINF 1000000000000000005 #define endl '\n' #define pb(x) push_back(x) #define X first #define Y second #define control cout<<"passed"<<endl; using namespace std; typedef pair <int, int> pii; typedef long long ll; typedef pair <ll, ll> pll; typedef pair <int, ll> pil; typedef pair <ll, int> pli; typedef long double ld; std::chrono::high_resolution_clock::time_point startT, currT; constexpr double TIME_MULT = 1; double timePassed() { using namespace std::chrono; currT = high_resolution_clock::now(); double time = duration_cast<duration<double>>(currT - startT).count(); return time * TIME_MULT; } vector <int> v[maxn]; bool nb[maxn][maxn]; void add(int a, int b) { v[a].pb(b); v[b].pb(a); nb[a][b] = true; nb[b][a] = true; } int dp[maxn][2]; int c[maxn]; bool used[maxn]; struct max_flow { struct edge { int from , to; int c , flow; edge(){}; edge(int _from , int _to , int _c , int _flow = 0) { from = _from; to = _to; c = _c; flow = _flow; } }; int n; vector <vector <int>> v; vector <int> used , to; vector <edge> e; void init(int _n) { n = _n; e.clear(); used.resize(n + 1); v.resize(n + 1); to.resize(n + 1); } int bre; void add_edge(int from , int to , int c) { v[from].pb(bre); v[to].pb(bre + 1); e.push_back({from , to , c}); e.push_back({to , from , 0}); bre += 2; } queue <int> q; bool bfs(int start , int endd) { for(int i = 0; i <= n; i++) used[i] = -1; used[start] = 0; q.push(start); int node; while(q.size() != 0) { node = q.front(); q.pop(); for(int idx : v[node]) if(used[e[idx].to] == -1 && e[idx].c > e[idx].flow) { q.push(e[idx].to); used[e[idx].to] = used[node] + 1; } } return used[endd] == -1? false : true; } int fix_flow(int node , int endd , int fl) { if(node == endd || fl == 0) return fl; int idx , nb; for(int i = to[node]; i < v[node].size(); i++ , to[node]++) { idx = v[node][i]; nb = e[idx].to; if(used[nb] != used[node] + 1) continue; if(e[idx].c <= e[idx].flow) continue; int fix = fix_flow(nb , endd , min(fl , e[idx].c - e[idx].flow)); if(fix == 0) continue; e[idx].flow += fix; e[idx ^ 1].flow -= fix; return fix; } return 0; } int find_flow(int start , int endd) { int ans = 0; while(bfs(start , endd) == true) { for(int i = 0; i <= n; i++) to[i] = 0; int curr; while((curr = fix_flow(start , endd , INF))) ans += curr; } return ans; } }; int type[maxn]; void bfs(int start) { type[start] = 1; queue <int> q; q.push(start); while(q.size() != 0) { int node = q.front(); q.pop(); for(int& e : v[node]) { if(type[e] != 0) continue; if(type[node] == 1) type[e] = 2; else type[e] = 1; q.push(e); } } } int findSample(int n, int confidence[], int host[], int protocol[]) { max_flow G; for(int i = 0; i < n; i++) c[i] = confidence[i]; for(int i = 1; i < n; i++) if(protocol[i] == 0) add(host[i], i); else if(protocol[i] == 1) for(int& e : v[host[i]]) add(e, i); else { for(int& e : v[host[i]]) add(e, i); add(host[i], i); } for(int node = 0; node < n; node++) if(type[node] == 0) bfs(node); G.init(n + 3); for(int i = 0; i < n; i++) if(type[i] == 2) G.add_edge(i , n + 1 , 1); else { for(int& e : v[i]) G.add_edge(i , e , 1); G.add_edge(n , i , 1); } return n - G.find_flow(n , n + 1); } /**int main() { #ifdef ONLINE_JUDGE freopen("input.in", "r", stdin); freopen("output.out", "w", stdout); #endif ios_base::sync_with_stdio(false); cin.tie(nullptr); ///startT = std::chrono::high_resolution_clock::now(); add(1 , 1 , 10 , 2 , 9 , 4); _remove(1 , 1 , 10 , 5 , 10 , 1); _remove(1 , 1 , 10 , 4 , 7 , 5); add(1 , 1 , 10 , 1 , 6 , 3); add(1 , 1 , 10 , 3 , 3 , 5); _remove(1 , 1 , 10 , 7 , 8 , 0); answer(1 , 1 , 10); for(int i = 0; i < 10; i++) cout << ans[i] << " "; cout << endl; return 0; } */

Compilation message (stderr)

friend.cpp: In member function 'int max_flow::fix_flow(int, int, int)':
friend.cpp:149:33: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  149 |         for(int i = to[node]; i < v[node].size(); i++ , to[node]++)
      |                               ~~^~~~~~~~~~~~~~~~
#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...