一个小细节100 —> 0
查看原帖
一个小细节100 —> 0
250699
mot1ve楼主2020/8/24 22:30

注释掉的是正确的,可以得100分,我这个代码这么写是0分。。没感觉有啥区别啊,因为一个点最多连两个边

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int sum;
int ans;
int n;
const int mod=10007;
int a[200010],head[200010];
struct node{
	int to,nxt;
}edge[400010];//无向图,双向边 
int idx;
void add(int u,int v)
{
	edge[++idx].nxt=head[u];
	edge[idx].to=v;
	head[u]=idx;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n-1;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(int j=1;j<=n;j++)//枚举中间点,不断更新最大值和次大值 
	{
		int max1=0,max2=0,temp=0,flag=0;
		for(int i=head[j];i;i=edge[i].nxt)
		{
			int v=edge[i].to;
			if(a[v]>max1)//最大值 
			{
				max2=max1;
				max1=a[v];
			}
			else if(a[v]>max2)//次大值 
			{
				max2=a[v];
			}
			
			if(!flag)      //sum=(sum+a[v]*temp)%mod;
			               //temp=(temp+a[v])%mod; 
		    {
				temp=a[v];
				flag=1;
				continue;
			}
			sum=(sum+a[v]*temp)%mod;
		}
		ans=max(ans,max1*max2);
	}
	cout<<ans<<" "<<(sum*2)%mod;
	return 0;
}
2020/8/24 22:30
加载中...