思路:状态应该被狗日了,,,sum没有请0等错误然后wa了9发
因为这个是树,而且没有森林,所以呢,只需要求出每条边两端的点数,然后经过这条边的次数就等于两边点数的乘积,此时因为是有方向的左到右,右到左,所以要double下。
还有就是福大是win环境,要用I64d输出LL。
// #pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <algorithm> #include <iomanip> #include <sstream> #include <string> #include <stack> #include <queue> #include <deque> #include <vector> #include <map> #include <set> #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <limits.h> using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> ii; const int inf = 1 << 30; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; inline int Readint(){ char c = getchar(); while(!isdigit(c)) c = getchar(); int x = 0; while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); } return x; } struct edge { int v,cost; }; vector<edge> G[100010]; LL sum; bool vis[100010]; int n,res; LL dfs(int u){ vis[u]=true; LL res=0; for (int i=0;i<G[u].size();++i){ int v = G[u][i].v; if (vis[v])continue; LL ans=dfs(v); sum+=ans*(n-ans)*G[u][i].cost*2; res+=ans; } return res+1; } int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int icase=0; int t; scanf("%d",&t); while(t--){ scanf("%d",&n); int a,b,c; sum=0LL; memset(vis, false,sizeof vis); for (int i=0;i<n;++i)G[i].clear(); for (int i=1;i<n;++i){ scanf("%d%d%d",&a,&b,&c); edge x,y; x.v=b,x.cost=c; y.v=a,y.cost=c; G[a].push_back(x); G[b].push_back(y); } dfs(0); printf("Case %d: ",++icase); printf("%I64d\n",sum); } return 0; }