洛谷A了,infoj上错一个点(想知道哪错了)
查看原帖
洛谷A了,infoj上错一个点(想知道哪错了)
736891
Eternality楼主2022/10/30 18:36
#include<bits/stdc++.h>
using namespace std;
#define PII pair<int,int>
#define int long long

const int N=3005,M=20005;
int n,m,k;
int to[M],nxt[M],h[N],tot;
int v[N],dis[N][N],V[N][10];
PII pre[N][10];
vector<int> ver[N];
int VAL[N][10],val[N],maxx;

void add(int x,int y)
{
	to[++tot]=y;
	nxt[tot]=h[x];
	h[x]=tot;
}

void BFS(int X)
{
	queue<int> q;
	memset(v,0,sizeof v);
	bool flag=false;
	q.push(X);
	v[X]=1;
	dis[X][X]=0;
	while(q.size())
	{
		if(flag)break;
		int x=q.front();
		q.pop();
		for(int i=h[x];i;i=nxt[i])
		{
			int y=to[i];
			if(v[y])continue;
			v[y]=1;
			dis[X][y]=dis[X][x]+1;
			if(dis[X][y]>k+1)
			{
				flag=true;
				break;
			}
			ver[X].push_back(y);
			q.push(y);
		}
	}
}

bool judge(int P,int x,int y)
{
	if(x==P)return false;
	if(x==1)return true;
	if(judge(P,pre[x][y].first,pre[x][y].second))return true;
	else return false;
}

void spfa()
{
	queue<PII> q;
	q.push({1,0});
	VAL[1][0]=0;
	V[1][0]=1;
	while(q.size())
	{
		PII x=q.front();q.pop();
		V[x.first][x.second]=0;
		if(x.second==4&&dis[1][x.first]<=k+1)maxx=max(maxx,VAL[x.first][x.second]);
		if(x.second==4)continue;
		for(int i=0;i<ver[x.first].size();i++)
		{
			int y=ver[x.first][i];
			if(!judge(y,x.first,x.second))continue;
			if(VAL[y][x.second+1]<VAL[x.first][x.second]+val[y])
			{
				pre[y][x.second+1]={x.first,x.second};
				VAL[y][x.second+1]=VAL[x.first][x.second]+val[y];
				if(!V[y][x.second+1])q.push({y,x.second+1}),V[y][x.second+1]=1;
			}
		}
	}
}

signed main()
{
	scanf("%lld%lld%lld",&n,&m,&k);
	for(int i=2;i<=n;i++)scanf("%lld",&val[i]);
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%lld%lld",&x,&y);
		add(x,y);
		add(y,x);
	}
	memset(dis,0x3f,sizeof dis);
	for(int i=1;i<=n;i++)BFS(i);
	spfa();
	cout<<maxx;
	return 0;
}
2022/10/30 18:36
加载中...