比赛 “Asm.Def战记之太平洋”杯 评测结果 AWWWTTTEEE
题目名称 Asm.Def的基本算法 最终得分 10
用户昵称 momo123 运行时间 5.789 s
代码语言 C++ 内存使用 172.29 MiB
提交时间 2015-11-02 11:32:26
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<algorithm>
#include<vector> 
#include<stack>
using namespace std;
int w[100005],a,n;
int dist[5000][5000];
int pre[5000][5000];
int minn,ww;
long long ans;
int cnt;
void print(int x)
{
	if(pre[a][x]==0)
	     return;
	minn=min(minn,pre[a][x]);
	print(pre[a][x]);
}
int main()
{
	freopen("asm_algo.in","r",stdin);
	freopen("asm_algo.out","w",stdout);
	cin>>n>>ww;
	w[1]=ww;
	memset(dist,0x7f,sizeof(dist));
	memset(pre,0,sizeof(pre));
	for(int i=2;i<=n;i++)
	{
		int pp,qq;
		cin>>pp>>qq;
		w[i]=qq%1000000007;
		dist[i][pp]=1;
		dist[pp][i]=1;
		pre[i][pp]=i;
		pre[pp][i]=pp;
	}
	for(int k=1;k<=n;k++)
	  for(int i=1;i<=n;i++)
	     for(int j=1;j<=n;j++)
	        if(i!=j&&j!=k&&k!=i)
	           if(dist[i][j]>dist[i][k]+dist[k][j])
	           {
	           	 dist[i][j]=dist[i][k]+dist[k][j];
	           	 pre[i][j]=pre[k][j];
			   }
	for(int i=1;i<=n;i++)
	   for(int j=1;j<=n;j++)
       {
	   	minn=min(i,j);
	   	a=i;
	   	print(j);
	   	ans+=w[i]*w[j]*w[minn]%1000000007;
	   }
	ans%=1000000007;
	cout<<ans;
}