70pts求调
查看原帖
70pts求调
1112642
CCCCCCnM楼主2024/10/23 22:10

错一堆,红绿交错,太好看了
代码是石山
求调(逻辑有问题?)
Subtask#0 错了 #32 #34 #38 #40 #44 #46
Subtask#1 对了 #3 #5 #7 #9 #16
Subtask#2 只对了 #21

#include<bits/stdc++.h>
using namespace std;
int n,m,k,val[2502],ans;
vector<int> cd[2501],cnc[2501];
queue<int> q;
bool flag[2501];
int f1[2501],f2_1st[2501],f2_2nd[2501],f2_n1st[2501],f2_n2nd[2501],f2_3rd[2501],f2_n3rd[2501]; 
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	for(int i = 2;i<=n;i++) scanf("%d",&val[i]);
	for(int i = 1;i<=m;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		cd[u].push_back(v);
		cd[v].push_back(u);
	}
	
	//bfs
	for(int i = 1;i<=n;i++)
	{
		while( !q.empty() ) q.pop();
		memset(flag,0,sizeof(flag));
		q.push(i);
		flag[i] = 1;
		for(int z = 0;z<=k;z++)
		{
			int l = q.size();
			for(int j = 1;j<=l;j++)
			{
				for(int a = 0;a<cd[q.front()].size();a++)
				{
					if(!flag[cd[q.front()][a]])
					{
						flag[cd[q.front()][a]] = 1;
						q.push(cd[q.front()][a]);
						cnc[i].push_back(cd[q.front()][a]);
					}
				}
				q.pop();
			}
		}
	}
	//贪心1,4 
	for(int i = 0;i<cnc[1].size();i++) f1[cnc[1][i]] = val[cnc[1][i]];
	//贪2,3
	for(int i = 2;i<=n;i++) //所有点 
	{
		for(int j = 0;j<cnc[i].size();j++)  //所有点的上一可达点 
		{
			int pl = cnc[i][j];
			if(f1[pl]!=0)
			{
				if(f2_1st[pl]<f1[pl]+val[i])
				{
					f2_3rd[i] = f2_3rd[i];
					f2_n3rd[i] = f2_n3rd[i];
					f2_2nd[i] = f2_1st[i];
					f2_n2nd[i] = f2_n1st[i];
					f2_1st[i] = f1[pl]+val[i];
					f2_n1st[i] = pl;
				}
				else if(f2_2nd[pl]<f1[pl]+val[i])
				{
					f2_3rd[i] = f2_3rd[i];
					f2_n3rd[i] = f2_n3rd[i];
					f2_2nd[i] = f1[pl]+val[i];
					f2_n2nd[i] = pl;
				}
				else if(f2_3rd[pl]<f1[pl]+val[i])
				{
					f2_3rd[i] = f1[pl]+val[i];
					f2_n3rd[i] = pl;
				}
			}
		}
	}
  //组合
	for(int i = 2;i<=n;i++)
	{
		for(int j = 0;j<cnc[i].size();j++)
		{
			int pl = cnc[i][j];
			if(pl==1) continue;
			int cmi[5] = {0,f2_1st[i],f2_2nd[i],f2_3rd[i]};
			int cmj[5] = {0,f2_1st[pl],f2_2nd[pl],f2_3rd[pl]};
			int cfi[5] = {0,f2_n1st[i],f2_n2nd[i],f2_n3rd[i]};
			int cfj[5] = {0,f2_n1st[pl],f2_n2nd[pl],f2_n3rd[pl]};
			for(int k1 = 1;k1<=3;k1++) for(int k2 = 1;k2<=3;k2++) if(cfi[k1]!=cfj[k2]&&cfi[k1]!=pl&&cfj[k2]!=i) ans = max(ans,cmi[k1]+cmj[k2]);
		}
	}
	cout<<ans<<endl;
	return 0;
}
2024/10/23 22:10
加载中...