Submission #384154

#TimeUsernameProblemLanguageResultExecution timeMemory
384154pure_memTraining (IOI07_training)C++14
100 / 100
69 ms8556 KiB
#include <bits/stdc++.h>

#define X first
#define Y second
#define MP make_pair
#define ll long long

using namespace std;

const int N = 1e3 + 1, M = 5e3 + 1, INF = 1e9;
const ll mod = 1e9 + 7;

int n, m, cost[M], tin[N], tout[N], cash[M], timer;
int h[N], parent[N], dp[(1 << 10)][N], rc[N][N];
pair<int, int> road[M];
vector< int > g[N], ch[N], maybe[N];

void dfs(int v, int pr){
	parent[v] = pr, tin[v] = ++timer;
	int j = 0;
	for(int to: g[v]){
		if(to != pr){
			h[to] = h[v] + 1, ch[v].push_back(to), rc[v][to] = j++;
			dfs(to, v);
		}
	}
	tout[v] = ++timer;
}
bool check(int x, int y){
	return (tin[x] <= tin[y] && tout[y] <= tout[x]);
}
int solve(int v, int mask){
	if(dp[v][mask] != -1)
		return dp[v][mask];
	int &res = dp[v][mask];
	res = 0;
	for(int i = 0;i < ch[v].size();i++){
		if((mask >> i) & 1)
			continue;
		res += solve(ch[v][i], 0);
	}
	for(int id: maybe[v]){
		int x = road[id].X, y = road[id].Y, newmask = mask, opt = 0;
		for(int i = 0;i < ch[v].size();i++){
  			if(check(ch[v][i], y))
  				swap(x, y);
  			if(check(ch[v][i], x)){
  				newmask ^= (1 << i);
  				if(cash[id] == -1){
  					int tmp = parent[x], last = x;
  					while(tmp != v){
  						opt += solve(tmp, 1 << (rc[tmp][last]));
  						last = tmp, tmp = parent[tmp];
  					}
  					opt += solve(x, 0);
  				}
  			}
		}
		if(cash[id] == -1)
			cash[id] = opt;
		if((newmask & mask) != mask)
			continue;
		opt = solve(v, newmask) + cost[id] + cash[id];
		res = max(res, opt);
	}
	return res;	
}

int main () {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	memset(dp, -1, sizeof(dp)), memset(cash, -1, sizeof(cash));
	cin >> n >> m;
	for(int i = 1, x, y;i <= m;i++){
		cin >> x >> y >> cost[i], road[i] = MP(x, y);
		if(!cost[i])
			g[x].push_back(y), g[y].push_back(x);
	}
	dfs(1, 1);
	int all = 0;
	for(int i = 1;i <= m;i++){
		if(!cost[i])
			continue;
		all += cost[i];
		int x = road[i].X, y = road[i].Y;
		if((h[x] + h[y]) & 1)
			continue;
	//	cerr << x << " " << y << "\n";
		while(x != y){
			if(h[x] < h[y])
				swap(x, y);
			x = parent[x];	
		}
		maybe[x].push_back(i);
	}
	solve(1, 0);
	cout << all - dp[1][0];
}

Compilation message (stderr)

training.cpp: In function 'int solve(int, int)':
training.cpp:37:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   37 |  for(int i = 0;i < ch[v].size();i++){
      |                ~~^~~~~~~~~~~~~~
training.cpp:44:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |   for(int i = 0;i < ch[v].size();i++){
      |                 ~~^~~~~~~~~~~~~~
#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...
#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...