Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 6573 | Accepted: 2217 |
Description
Input
Output
Sample Input
5 1 1 2 1 2 4 1 2 1 3 2 4 3 5 0 0
Sample Output
33
Source
#include <cstdio> #include <cmath> #include <algorithm> #include <iostream> #include <cstring> #include <map> #include <string> #include <stack> #include <cctype> #include <vector> #include <queue> #include <set> using namespace std; //#define Online_Judge #define outstars cout << "***********************" << endl; #define clr(a,b) memset(a,b,sizeof(a)) #define lson l , mid , rt << 1 #define rson mid + 1 , r , rt << 1|1 #define FOR(i , x , n) for(int i = (x) ; i < (n) ; i++) #define FORR(i , x , n) for(int i = (x) ; i <= (n) ; i++) #define REP(i , x , n) for(int i = (x) ; i > (n) ; i--) #define REPP(i ,x , n) for(int i = (x) ; i >= (n) ; i--) #define mid ((l + r) >> 1) #define mk make_pair const int MAXN = 1000 + 100; const int maxw = 10000000 + 20; const int MAXNNODE = 10000 +10; const long long LLMAX = 0x7fffffffffffffffLL; const long long LLMIN = 0x8000000000000000LL; const int INF = 0x7fffffff; const int IMIN = 0x80000000; #define eps 1e-8 #define mod 10007 typedef long long LL; const double PI = acos(-1.0); typedef double D; typedef pair<int , int> pii; struct node { int i , next , cost; }verx[MAXN]; int head[MAXN] , N , num[MAXN] , fact[MAXN], father[MAXN] , vis[MAXN]; int add (int s , int w) { verx[N].i = w; verx[N].cost = 0; verx[N].next = head[s]; return N++; } int find(int n , int root) { int k; D max = 0; FORR(i , 1 , n) { if(!vis[i]&&i != root&&max < (D)fact[i] / num[i]) { max = (D)fact[i] / num[i]; k = i; } } return k; } void Union(int k , int pre) { fact[pre] += fact[k]; num[pre] += num[k]; for(int j = head[k] ; j ; j = verx[j].next) { father[verx[j].i] = pre; } } int work(int n , int root) { int k , pre , sum = 0; FOR(i , 1 , n) { k = find(n , root);///查找最大平均值 vis[k] = 1; pre = father[k]; while(vis[pre])pre = father[pre];///查找father[k]所在的集合 sum += num[pre] * fact[k]; Union(k , pre); } return sum + fact[root]; } int main() { //ios::sync_with_stdio(false); #ifdef Online_Judge freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif // Online_Judge int m , n , s , w; while(scanf("%d%d" , &n , &m)&&(n || m)) { clr(vis , 0); N = 1; clr(head , 0); FORR(i , 1 , n) { scanf("%d",&fact[i]); num[i] = 1; } FOR(i , 1 , n) { scanf("%d%d" , &s , &w); head[s] = add(s , w); father[w] = s; } printf("%d\n",work(n , m)); } return 0; }