【BZOJ】【2435】【NOI2011】道路修建
DFS/DP
本来以为是一道傻逼题,然而跪了好久……一直RE……
直接dfs就好了……x->y val=c : ans+=abs(n-size[y]-size[y])*c;
然而为啥会一直RE呢?
后来改成dfs返回当前节点的size就过了……过了……
100W的节点难道linux下也会爆栈嘛= =?sad
1 /************************************************************** 2 Problem: 2435 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:5292 ms 7 Memory:73348 kb 8 ****************************************************************/ 9 10 //BZOJ 2435 11 #include<vector> 12 #include<cstdio> 13 #include<cstring> 14 #include<cstdlib> 15 #include<iostream> 16 #include<algorithm> 17 #define rep(i,n) for(int i=0;i<n;++i) 18 #define F(i,j,n) for(int i=j;i<=n;++i) 19 #define D(i,j,n) for(int i=j;i>=n;--i) 20 #define pb push_back 21 using namespace std; 22 inline int getint(){ 23 int v=0,sign=1; char ch=getchar(); 24 while(ch<'0'||ch>'9'){ if (ch=='-') sign=-1; ch=getchar();} 25 while(ch>='0'&&ch<='9'){ v=v*10+ch-'0'; ch=getchar();} 26 return v*sign; 27 } 28 const int N=1001000,INF=~0u>>2; 29 typedef long long LL; 30 /******************tamplate*********************/ 31 32 int to[N<<1],nxt[N<<1],head[N],cnt,l[N<<1]; 33 void add(int x,int y,int z){ 34 to[++cnt]=y; nxt[cnt]=head[x]; head[x]=cnt; l[cnt]=z; 35 to[++cnt]=x; nxt[cnt]=head[y]; head[y]=cnt; l[cnt]=z; 36 } 37 int n,s[N]; 38 LL ans; 39 40 int dfs(int x,int fa){ 41 s[x]=1; 42 for(int i=head[x];i;i=nxt[i]) 43 if (to[i]!=fa){ 44 s[x]+=dfs(to[i],x); 45 ans+=(LL)abs(n-s[to[i]]*2)*l[i]; 46 } 47 return s[x]; 48 } 49 int main(){ 50 #ifndef ONLINE_JUDGE 51 freopen("2435.in","r",stdin); 52 freopen("2435.out","w",stdout); 53 #endif 54 n=getint(); 55 F(i,2,n){ 56 int x=getint(),y=getint(),z=getint(); 57 add(x,y,z); 58 } 59 dfs(1,0); 60 cout <<ans<<endl; 61 return 0; 62 }
2435: [Noi2011]道路修建
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2477 Solved: 753
[Submit][Status][Discuss]
Description
在 W 星球上有 n 个国家。为了各自国家的经济发展,他们决定在各个国家
之间建设双向道路使得国家之间连通。但是每个国家的国王都很吝啬,他们只愿
意修建恰好 n – 1条双向道路。 每条道路的修建都要付出一定的费用,
这个费用等于道路长度乘以道路两端的国家个数之差的绝对值。例如,在下图中,虚线所示道路两端分别有 2 个、4个国家,如果该道路长度为
1,则费用为1×|2 – 4|=2。图中圆圈里的数字表示国家的编号。
由于国家的数量十分庞大,道路的建造方案有很多种,同时每种方案的修建
费用难以用人工计算,国王们决定找人设计一个软件,对于给定的建造方案,计
算出所需要的费用。请你帮助国王们设计一个这样的软件。
Input
输入的第一行包含一个整数n,表示 W 星球上的国家的数量,国家从 1到n
编号。接下来 n – 1行描述道路建设情况,其中第 i 行包含三个整数ai、bi和ci,表
示第i 条双向道路修建在 ai与bi两个国家之间,长度为ci。
Output
输出一个整数,表示修建所有道路所需要的总费用。
Sample Input
6
1 2 1
1 3 1
1 4 2
6 3 1
5 2 1
Sample Output
20
HINT
n = 1,000,000 1≤ai, bi≤n
0 ≤ci≤ 10^6