100分,WA,求条
查看原帖
100分,WA,求条
927883
Xwty楼主2024/10/13 17:11

关于我被#24hack这件事……

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,val[3305],a,b,k,mp[3305][3305];
int dis[3305][7];
vector<int> v[3500];
int vis[3500];
struct node{
	int now,num,cnt;
	set<int> st;
};
struct node2{
	int u,step;
};

void bfs(int sx)
{
	for(int i=0;i<=n;i++)vis[i]=0;
	queue<node2> q;
	q.push({sx,0});
	vis[sx]=1;
	while(!q.empty())
	{
		node2 f=q.front();q.pop();
		mp[sx][f.u]=mp[f.u][sx]=min(mp[sx][f.u],f.step);
		for(auto go:v[f.u]) if(!vis[go]) vis[go]=1,q.push({go,f.step+1});
	}
}

void floyed()
{
	for(int i=1;i<=n;i++)bfs(i);
}

signed main()
{
//	freopen("P8817_24.in","r",stdin);
//	freopen("P8817.out","w",stdout);
	cin>>n>>m>>k;
	for(int i=2;i<=n;i++)cin>>val[i];
	for(int i=0;i<=3300;i++)
		for(int j=0;j<=3300;j++)
			mp[i][j]=1e18;
	for(int i=1;i<=n;i++)mp[i][i]=0;
	for(int i=1;i<=m;i++)
	{
		cin>>a>>b;
		mp[a][b]=mp[b][a]=1;
		v[a].push_back(b);
		v[b].push_back(a);
	}
	for(int i=0;i<=n+5;i++)
		for(int j=0;j<=6;j++)
			dis[i][j]=1e18;
	floyed();
	queue<node> q;
	node tmp;
	tmp.now=1;
	tmp.num=0;
	tmp.cnt=0;
	tmp.st.insert(1);
	q.push(tmp);
	while(!q.empty())
	{
		node f=q.front();q.pop();
		if(f.cnt>=4)continue;
		for(int go=2;go<=n;go++)
		{
			if(go==f.now)continue;
			if(mp[f.now][go]-1<=k&&dis[go][f.cnt+1]<=f.num+val[go]&&f.st.find(go)==f.st.end())
			{
				dis[go][f.cnt+1]=f.num+val[go];
				node t;
				t.now=go;
				t.num=f.num+val[go];
				t.cnt=f.cnt+1;
				t.st=f.st;
				t.st.insert(go);
				q.push(t);
			}
		}
	}
	int ans=-1;
	for(int i=0;i<=n;i++) if(mp[i][1]-1<=k) ans=max(ans,dis[i][4]);
	cout<<ans<<endl;
	return 0;
}
2024/10/13 17:11
加载中...