bzoj 3498 PA2009 Cakes

N个点m条边,每个点有一个点权a。

对于任意一个三元环(i,j,k)(i<j<k),它的贡献为max(ai,aj,ak) 

求所有三元环的贡献和。

N<100000

m<250000

模拟题意即可……

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 1e5 + 10;
 4 vector<int> g[N];
 5 int deg[N], val[N], vis[N], n, m;
 6 long long ans;
 7 struct E { int u, v; } e[N * 3];
 8 int main() {
 9     scanf("%d%d", &n, &m);
10     for(int i = 1 ; i <= n ; ++ i) scanf("%d", &val[i]);
11     for(int i = 1 ; i <= m ; ++ i) {
12         scanf("%d%d", &e[i].u, &e[i].v);
13         ++ deg[e[i].u], ++ deg[e[i].v];
14     }
15     for(int i = 1 ; i <= m ; ++ i) {
16         int u = e[i].u, v = e[i].v;
17         if(deg[u] < deg[v] || (deg[u] == deg[v] && u > v)) swap(u, v);
18         g[u].push_back(v);
19     }
20     for(int x = 1 ; x <= n ; ++ x) {
21         for(int i = 0 ; i < g[x].size() ; ++ i) vis[g[x][i]] = x;
22         for(int i = 0 ; i < g[x].size() ; ++ i) {
23             int y = g[x][i];
24             for(int j = 0 ; j < g[y].size() ; ++ j) {
25                 int z = g[y][j];
26                 if(vis[z] == x) {
27                     ans += max(max(val[x], val[y]), val[z]);
28                 }
29             }
30         }
31     }
32     printf("%lld\n", ans);
33 }
bzoj 3498 PA2009 Cakes
posted @ 2018-08-17 14:59  KingSann  阅读(387)  评论(0编辑  收藏  举报