95是什么问题大佬教一下
查看原帖
95是什么问题大佬教一下
180924
FLAT_LCH楼主2022/10/30 14:20
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cmath>

#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
#define M 10

using namespace std;

struct bian
{
	int v,nex;
}s[21000];
struct node
{
	int head,val;
	int dis,vis;
}p[2510];

int n,m,t,ans=0;
int len=0;
int f[2510][2510]={};
bool could[2510][2510];
int maxx[2510][M]={},dui[2510][M];
inline int rd()
{
	int s=0;char x='x';
	while(x<'0'||x>'9')x=getchar();
	while(x>='0'&&x<='9')s=s*10+(x^48),x=getchar();
	return s;
}

inline void lian(int u,int v)
{
	s[++len]={v,p[u].head};p[u].head=len;
	s[++len]={u,p[v].head};p[v].head=len;
}

void readd()
{
	n=rd();m=rd();t=rd();
	//cout<<n<<' '<<m<<endl;
	p[1].val=0;
	for(int i=2;i<=n;i++)p[i].val=rd(),p[i].dis=inf;//,cout<<p[i].val<<' '<<i<<"!!!\n";
	for(int i=1,u,v;i<=m;i++)
	{
		u=rd();v=rd();
		lian(u,v);
	//	cout<<i<<' '<<m<<"@@"<<endl;
	}
}

void bfs1()
{
	int u;

	p[1].dis=0;
	queue<int>q;
	q.push(1);
	while(q.size())
	{
		u=q.front();q.pop();
		//cout<<u<<endl;
		if(p[u].dis<=t)
			f[u][0]=p[u].val;
		else continue;
		for(int i=p[u].head,v;i;i=s[i].nex)
		{
			v=s[i].v;
			if(p[v].dis>p[u].dis+1)
			{
				p[v].dis=p[u].dis+1;
				q.push(v);
			}
		}
	}
}

void bfs2(int st)
{
	//cout<<st<<' '<<f[st][0]<<"@@"<<endl;
	if(f[st][0]==0)return;
	int u;

	p[st].dis=0;p[st].vis=st;
	queue<int>q;
	q.push(st);
	while(q.size())
	{
		u=q.front();q.pop();
		/*if(st==3)
		{
			cout<<u<<' '<<"bfs2``````````````````\n";
		}*/
		if(p[u].dis<=t)
		{
			//could[st][u]=true;
			if(u!=st)
				f[st][u]=p[u].val+f[st][0];
		}
		else continue;
		for(int i=p[u].head,v;i;i=s[i].nex)
		{
			v=s[i].v;
			if(p[v].vis!=st)
			{
				p[v].vis=st;
				p[v].dis=p[u].dis+1;
				q.push(v);
			}
		}
	}
}

void bfs3(int st)
{
	int u;

	p[st].dis=0;p[st].vis=st;
	queue<int>q;
	q.push(st);
	while(q.size())
	{
		u=q.front();q.pop();
		if(p[u].dis<=t)
		{
			could[st][u]=true;
		}
		else continue;
		for(int i=p[u].head,v;i;i=s[i].nex)
		{
			v=s[i].v;
			if(p[v].vis!=st)
			{
				p[v].vis=st;
				p[v].dis=p[u].dis+1;
				q.push(v);
			}
		}
	}
}

void getans()
{
	memset(maxx,-0x3f,sizeof(maxx));
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			for(int k=0;k<M;k++)
			{
				if(f[i][j]>maxx[j][k])
				{
					for(int l=M-1;l>k;l--)maxx[j][l]=maxx[j][l-1],dui[j][l]=dui[j][l-1];
					maxx[j][k]=f[i][j];dui[j][k]=i;
					break;
				}
			}
		}
	}
	
	//cout<<"!!!!";
	//cout<<f[7][4]<<' '<<f[2][3]<<' '<<could[4][3]<<endl;
	//cout<<f[4][3]<<endl;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(i==j)continue;
			if(!could[i][j])continue;
			for(int k=0;k<M;k++)
			{
				/*if(i==4)
				{
					cout<<maxx[i][k]<<"!!!!"<<endl;
				}*/
				if(dui[i][k]==j)continue;
				for(int l=0;l<M;l++)
				{
					if(dui[j][l]==i||dui[j][l]==dui[i][k])continue;
					if(dui[i][k]==0||dui[j][l]==0)continue;
					//if(1||maxx[i][k]&&maxx[j][l])cout<<dui[i][k]<<' '<<i<<' '<<j<<' '<<dui[j][l]<<endl;
					ans=max(ans,maxx[i][k]+maxx[j][l]);
				}
			}
		}
	}
}

signed main()
{
	//freopen("holiday.in","r",stdin);
	//freopen("holiday.out","w",stdout);
	
	readd();t++;
	bfs1();
	for(int i=1;i<=n;i++)
		bfs2(i);
	for(int i=1;i<=n;i++)p[i].vis=-1;
	for(int i=1;i<=n;i++)
		bfs3(i);
	//cout<<p[1].g[0]<<endl;
	getans();
	cout<<ans;
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}
2022/10/30 14:20
加载中...