ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

HDU 4303 Hourai Jeweled Ê÷ÐÎdp ËùÓз¾¶µãȨºÍ dfs2´Î
2015-07-20 17:34:48 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:1´Î
Tags£ºHDU 4303 Hourai Jeweled Ê÷ÐÎ ËùÓР·¾¶ dfs2

ÌâÒ⣺

long long ans = 0;

for(int i = 1; i <= n; i++)

for(int j = i+1; j <= n; j++)

ans += F(i,j);

F(i,j)±íʾiµãµ½jµã·¾¶ÉÏËùÓеĵãȨºÍ¡£

Èôi->j·¾¶ÉÏ´æÔÚ2ÌõÏàÁڱ߱ßȨÏàͬÔò F(i,j) = 0

ÎÊ£ºansµÄÖµ¡£


int³Ë·¨±¬µôÁËÎÒÒ²×íÁË¡£¡£¡£


˼·£º

ºÍÍøÉϵÄͳ¼Æ±ß·½·¨²»Í¬£¬ÕâÀïÊÇÓÃͳ¼Æµã³öÏֵĴÎÊýÀ´¼ÆËã

ÎÒÃǼÆËãÿ¸öµãi ³öÏֵĴÎÊý£¬Ôò´ð°¸¾ÍÊÇ iµÄ´ÎÊý*iµÄµãȨ => dp[i] * a[i]

¶øi³öÏֵķ¾¶ÆðµãºÍÖÕµãÓÐ4ÖÖ

1¡¢iµÄ×ÓËï->iµÄ×ÓËï

2¡¢iµÄ×ÓËï->i

3¡¢iµ½ £¨·ÇiµÄ×ÓË ¼´iµÄ׿ÏȽڵ㣬ÐֵܽڵãºÍÐֵܽڵãµÄ×ÓËï

4¡¢iµÄ×ÓËï->·ÇiµÄ×ÓËï

ËùÒÔÏȼÆËã1,2µÄÇé¿ö £¬ÓÃdp1[i]¼Ç¼

3£¬4µÄÇé¿öÓÃdp2[i]¼Ç¼

Ôò´ð°¸¾ÍÊÇ for(int i = 1; i <= n; i++) ans += a[i] * (dp1[i]+dp2[i]);

siz[u] ±íʾÒÔuΪ¸ùµÄ×ÓÊ÷ÖÐÓÐЧµÄ½ÚµãÊý£¬Èô u -> v(col = 1) && v -> k(col=1), ÔòÒÔkΪ¸ùµÄ×ÓÊ÷¶¼²»ÊÇÓÐЧ½Úµã

(ÆäÖÐvÊÇuµÄ¶ù×Ó£¬kÊÇvµÄ¶ù×Ó£©

mp[u][col]±íʾÒÔuΪ¸ù£¬ÓÐЧ½ÚµãÖÐ ÓÃÑÕɫΪcolµÄ±ßÏàÁ¬µÄ½Úµã¸öÊý

#include 
using namespace std;
#define N 300100
struct Edge{
	int to, col, nex;
}edge[N<<1];
int head[N], edgenum;
void init(){memset(head, -1, sizeof head); edgenum = 0;}
void add(int u, int v, int col){
	Edge E = {v, col, head[u]};
	edge[edgenum] = E;
	head[u] = edgenum++;
}
typedef long long ll;
template 
   
     inline bool rd(T &ret) { char c; int sgn; if(c=getchar(),c==EOF) return 0; while(c!='-'&&(c<'0'||c>'9')) c=getchar(); sgn=(c=='-')?-1:1; ret=(c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0'); ret*=sgn; return 1; } template 
    
      inline void pt(T x) { if(x>9) pt(x/10); putchar(x%10+'0'); } int n, k; ll dp1[N], dp2[N], a[N]; int siz[N]; map
     
       mp[N], mp2[N];//mp[u][col]±íʾu×ÓÊ÷Ï ±ßÑÕÉ«=col µÄÓÐЧµÄµãÊý void dfs1(int u, int fa){ siz[u] = 0; dp1[u] = 0; for(int i = head[u]; ~i; i = edge[i].nex) { int v = edge[i].to; if(v == fa)continue; dfs1(v, u); mp[u][edge[i].col] += siz[v] - mp[v][edge[i].col]; siz[u] += siz[v] - mp[v][edge[i].col]; } ll dou = 0; for(int i = head[u]; ~i; i = edge[i].nex) { int v = edge[i].to; if(v == fa)continue; dou += (ll)(siz[v] - mp[v][edge[i].col]) * (ll)(siz[u] - mp[u][edge[i].col]); dp1[u] += siz[v] - mp[v][edge[i].col]; } dp1[u] += dou >> 1; siz[u]++; } void dfs2(int u, int ok, int col, int fa) { dp2[u] = (ll)(siz[u] - mp[u][col]) * (ll)ok; for(int i = head[u]; ~i; i = edge[i].nex) { int v = edge[i].to; if(v == fa)continue; if(u != fa && edge[i].col == col) dfs2(v, siz[u] - mp[u][edge[i].col], edge[i].col, u); else dfs2(v, ok + siz[u] - mp[u][edge[i].col], edge[i].col, u); } } void solve(){ init(); for(int i = 1; i <= n; i++)rd(a[i]), mp[i].clear(), mp2[i].clear(); for(int i = 1, u, v, d; i < n; i++) { rd(u);rd(v);rd(d); add(u,v,d); add(v,u,d); } dfs1(1, 1); dfs2(1, 0, -1, 1); } int main() { while(rd(n)){ solve(); ll ans = 0; for(int i = 1; i <= n; i++) ans += a[i]*(dp1[i]+dp2[i]); pt( ans );putchar('\n'); } return 0; } /* 4 1 10 100 1000 1 2 1 2 3 1 3 4 1 5 1 10 100 1000 10000 1 2 1 2 3 1 3 4 1 2 5 2 11 1 2 3 4 5 6 7 8 9 111 123 1 2 1 1 3 2 2 4 3 2 5 1 3 6 3 3 7 3 5 8 1 5 9 2 8 10 1 11 8 2 14 1 2 3 4 5 6 7 8 9 111 123 235 66 1000 1 2 1 1 3 2 2 4 3 2 5 1 3 6 3 3 7 3 5 8 1 5 9 2 8 10 1 11 8 2 12 11 2 8 13 1 8 14 2 10 1 1 1 1 1 1 1 1 1 1 1 2 1 1 7 1 1 10 2 2 3 5 2 6 4 3 4 1 3 5 8 7 8 2 7 9 1 14 1 2 5 10 20 30 70 80 100 1000 2000 5000 100000 1000000 1 2 2 1 3 1 1 4 1 2 5 2 2 8 3 3 9 3 3 6 2 4 7 1 4 10 3 3 11 3 6 12 2 13 1 2 14 3 3 */ 
     
    
   


¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºPOJ 1988 Cube Stacking (ÖÖÀಢ.. ÏÂһƪ£ºBZOJ 1269 Îı¾±à¼­Æ÷ Splay

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ:

¡¤Linuxϵͳ¼ò½é (2025-12-25 21:55:25)
¡¤Linux°²×°MySQL¹ý³Ì (2025-12-25 21:55:22)
¡¤Linuxϵͳ°²×°½Ì³Ì£¨ (2025-12-25 21:55:20)
¡¤HTTP Åc HTTPS µÄ²î„ (2025-12-25 21:19:45)
¡¤ÍøÕ¾°²È«±ØÐ޿ΣºÍ¼ (2025-12-25 21:19:42)