답안 #105770

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
105770 2019-04-14T12:08:51 Z dimash241 Telegraph (JOI16_telegraph) C++17
0 / 100
18 ms 14464 KB
# include <stdio.h>
# include <bits/stdc++.h>


#define _USE_MATH_DEFINES_
#define ll long long
#define ld long double
#define Accepted 0
#define pb push_back
#define mp make_pair
#define sz(x) (int)(x.size())
#define every(x) x.begin(),x.end()
#define F first
#define S second
#define For(i,x,y)  for (int i = x; i <= y; i ++) 
#define FOr(i,x,y)  for (int i = x; i >= y; i --)
#define SpeedForce ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
// ROAD to...                                                                                                                                                                                                                Red

using namespace std;
inline double Time() {return (clock() * 1.0) / CLOCKS_PER_SEC; } 
inline bool isvowel (char c) {
	c = tolower(c);
    if (c == 'a' || c == 'e' || c == 'i' || c == 'y' || c == 'o' || c == 'u') return 1;
    return 0;
}

const double eps = 0.000001;
const ld pi = acos(-1);
const int maxn = 1e7 + 9;
const int mod = 1e9 + 7;
const ll MOD = 1e18 + 9;
const ll INF = 1e18 + 123;
const int inf = 2e9 + 11;
const int mxn = 1e6 + 9;
const int N = 6e5 + 123;                                          
const int M = 22;
const int pri = 997;
const int Magic = 2101;

const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, -1, 0, 1};
 
int n, m, k;
int p[N], c[N];
int u[N];
int cnt[N];
ll dp[N], sum;
int val[N];
vector < int > g[N];

void dfs (int v) {
	u[v] = 2;
	for (auto to : g[v]) {
		if (u[to] == 2) continue;
		dfs(to);
		dp[v] += dp[to];
		dp[v] += c[to];
		val[v] = max(val[v], c[to]);
	}
	dp[v] -= val[v];
}

ll solve (vector < int > &cycle) {
	ll f[2] = {0, 0};
	f[1] = INF;
	int m = cycle.size();
	for(int j = 0; j < m; j ++) {
        int v = cycle[j], nxt = cycle[(j + 1) % m];
        dfs(v);
        f[1] = min(f[1] + dp[v] + val[v], f[0] + dp[v] + c[nxt]);
        f[0] += dp[v] + val[v];
    	f[0] = min(f[1], f[0]);
    }
	return f[1];

}

int main () {               
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
    	scanf("%d%d", &p[i], &c[i] );
    	g[p[i]].pb(i);
    	cnt[p[i]] ++;
    	sum += c[i];
    }

    ll res = 0;
    for (int i = 1; i <= n; i ++) {
    	if (u[i]) continue;
    	int v = i;
    	while (!u[v]) {
    		u[v] = 1;
    		v = p[v];
    	}
    	vector < int > cycle;
    	while (u[v] != 2) {
    		u[v] = 2;
    		cycle.pb(v);
    		v = p[v];
    	}
    	if (cycle.size() == n) {
    		cout << 0;
    		exit(0);
    	}
    	res += solve(cycle); 
    	
    }
	

    printf("%lld", res);


    return Accepted;
}

// B...a D....

Compilation message

telegraph.cpp: In function 'int main()':
telegraph.cpp:102:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      if (cycle.size() == n) {
          ~~~~~~~~~~~~~^~~~
telegraph.cpp:80:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &n);
     ~~~~~^~~~~~~~~~
telegraph.cpp:82:11: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
      scanf("%d%d", &p[i], &c[i] );
      ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 18 ms 14464 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 18 ms 14464 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 18 ms 14464 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 18 ms 14464 KB Output isn't correct
2 Halted 0 ms 0 KB -