我的思路或代码哪里有问题?
查看原帖
我的思路或代码哪里有问题?
42812
Wenchih楼主2020/11/2 08:44
  • 先读入数据,找出最大好感度及其村庄序号
  • 之后操作每一个最大好感度的序号,增加其附近村庄的好感度,并依次来维护最大好感度及其村庄序号
  • 然而就通过了第四点
struct pp
{
	long long w;
	int ai;//所能到达顶点的个数,以此来维护下面的a数组
	int a[3];
}q[2000005];
int t;
int n;
long long m;
int x,y;
int maxp;//好感度最大的村庄的编号
long long maxw=0;
void addedge(int u,int v);
void oppoint(int u);
int main()
{
	cin.sync_with_stdio(false);
	cout.tie(0);
	freopen("text.in","r",stdin);
	cin >> t;
	for(int i=1;i<=t;i++)
	{
		cin >> n >> m;
		maxp=0;
		maxw=0;
		for(int j=1;j<=n;j++)
		{
			cin >> q[j].w;
			if(maxw<q[j].w)
			{
				maxw=q[j].w;
				maxp=j;
			}
			q[j].ai=0;//初始化
		}
		for(int j=1;j<n;j++)
		{
			cin >> x >> y;
			addedge(x,y);//增加x->y的边
			addedge(y,x);//增加y->x的边
		}
		for(long long j=1;j<=m;j++)
		{
			oppoint(maxp);
		}
		cout << maxp << endl;
	}
	return 0;
}
void addedge(int u,int v)
{
	q[u].a[q[u].ai]=v;
	q[u].ai++; 
}
void oppoint(int u)
{
	int tmp;
	for(int i=0;i<q[u].ai;i++)//循环每一个可到达的顶点
	{
		tmp=q[u].a[i];//可到达的顶点编号
		q[tmp].w++;
		if(maxw<q[tmp].w)//选权值小的
		{
			maxw=q[tmp].w;
			maxp=tmp;
		}
		else if(maxw==q[tmp].w&&maxp>tmp)//权值相同,选编号小的
		{
			maxp=tmp;
		}
	}
}
2020/11/2 08:44
加载中...