提示信息为 “Wrong Answer. wrong answer On line 1 column 2, read 1, expected 0.”。
#include <stdio.h>
#define oxis 100001
long long int sum(const int *begin, const int *end)
{
long long int result = 0;
do result += *begin; while (++begin != end);
return result;
}
int set_max(int *host, int guest)
{
if (*host == guest) {
return 0;
} else if (*host < guest) {
*host = guest;
return 1;
} else return -1;
}
int set_min(int *host, int guest)
{
if (*host == guest) {
return 0;
} else if (*host > guest) {
*host = guest;
return 1;
} else return -1;
}
int main(void)
{
int n, i;
long long int sum_ring_break_cost = 0;
static int receiver[oxis], weight[oxis], receivee_chong[oxis];
static int visited[oxis], max_receivee[oxis];
scanf("%d", &n);
for (i = 1; i <= n; ++i)
scanf("%d%d", i + receiver, i + weight);
for (i = 1; i <= n; ++i) {
int cur = receiver[i];
switch (set_max(max_receivee + cur, weight[i])) {
case 1: receivee_chong[cur] = 0; break;
case 0: receivee_chong[cur] = 1; break;
}
}
for (i = 1; i <= n; ++i) {
int cur, i0;
for (cur = i; !visited[cur]; cur = receiver[cur])
visited[cur] = i;
if (weight[cur] != max_receivee[receiver[cur]]
|| receivee_chong[receiver[cur]]
|| visited[cur] != i) continue;
int min_cur_break_cost = weight[cur], base = 1;
for (i0 = receiver[cur]; i0 != cur; i0 = receiver[i0]) {
if (weight[i0] != max_receivee[receiver[i0]]
|| receivee_chong[receiver[i0]])
goto no_more_a_ring;
++base;
set_min(&min_cur_break_cost, weight[i0]);
}
if (base == n) return puts("0") == EOF;
sum_ring_break_cost += min_cur_break_cost;
no_more_a_ring: ;
}
return !printf("%lld\n", sum(1 + weight, 1 + n + weight)
- sum(1 + max_receivee, 1 + n + max_receivee)
+ sum_ring_break_cost);
}