mxqz WA of 70pts
查看原帖
mxqz WA of 70pts
546944
Kuroneko楼主2022/11/13 17:22

思路就是枚举bc,预处理ad,但是wa了

评测记录

#include<iostream> 
#include<cstring> 
#include<algorithm> 
#include<queue>
using namespace std; 
const int N=2510,M=20010; 
typedef long long LL;
LL n,m,k,ans,idx; 
LL h[N],e[M],ne[M],w[M]; 
LL m1[N],m2[N],m3[N]; 
bool st[N],vis[N][N]; 
void bfs(int u) 
{ 
	memset(st,false,sizeof st); 
	int cnt[N]; 
	queue<int> q;
	memset(cnt,0,sizeof cnt); 
	q.push(u),st[u]=true; 
	while(!q.empty()) 
	{ 
		int t=q.front();
		q.pop(); 
		for(int i=h[t];~i;i=ne[i]) 
		{ 
			int j=e[i];
			if(st[j]) continue; 
			else
			{ 
				vis[u][j]=vis[j][u]=true; 
				st[j]=true;
				if(cnt[t]<k) q.push(j); 
				cnt[j]=cnt[t]+1; 
				if(w[j]>=m1[u]&&vis[j][1]) m3[u]=m2[u],m2[u]=m1[u],m1[u]=j; 
				else if(w[j]>=m2[u]&&vis[j][1]) m3[u]=m2[u],m2[u]=j; 
				else if(w[j]>=m3[u]&&vis[j][1]) m3[u]=j; 
			}	 
		} 
	} 
	return; 
} 
void add(int a,int b)
{
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int main() 
{ 
	memset(h,-1,sizeof h); 
	cin>>n>>m>>k; 
	for(int i=2;i<=n;i++) cin>>w[i]; 
	for(int i=1,a,b;i<=m;i++) cin>>a>>b,add(a,b),add(b,a); 
	for(int i=1;i<=n;i++) bfs(i); 
	for(int i=2;i<=n;i++) 
		for(int j=2;j<=n;j++) 
		{ 
			int ret=w[i]+w[j]; 
			if(!vis[i][j]) continue; 
			if(m1[i]!=0&&m1[j]!=0&&m1[i]!=j&&m1[i]!=m1[j]&&m1[j]!=i) ans=max(ans,ret+w[m1[i]]+w[m1[j]]); 
			if(m1[i]!=0&&m2[j]!=0&&m1[i]!=j&&m1[i]!=m2[j]&&m2[j]!=i) ans=max(ans,ret+w[m1[i]]+w[m2[j]]); 
			if(m1[i]!=0&&m3[j]!=0&&m1[i]!=j&&m1[i]!=m3[j]&&m3[j]!=i) ans=max(ans,ret+w[m1[i]]+w[m3[j]]); 
			if(m2[i]!=0&&m1[j]!=0&&m2[i]!=j&&m2[i]!=m1[j]&&m1[j]!=i) ans=max(ans,ret+w[m2[i]]+w[m1[j]]); 
			if(m2[i]!=0&&m2[j]!=0&&m2[i]!=j&&m2[i]!=m2[j]&&m2[j]!=i) ans=max(ans,ret+w[m2[i]]+w[m2[j]]); 
			if(m2[i]!=0&&m3[j]!=0&&m2[i]!=j&&m2[i]!=m3[j]&&m3[j]!=i) ans=max(ans,ret+w[m2[i]]+w[m3[j]]); 
			if(m3[i]!=0&&m1[j]!=0&&m3[i]!=j&&m3[i]!=m1[j]&&m1[j]!=i) ans=max(ans,ret+w[m3[i]]+w[m1[j]]); 
			if(m3[i]!=0&&m2[j]!=0&&m3[i]!=j&&m3[i]!=m2[j]&&m2[j]!=i) ans=max(ans,ret+w[m3[i]]+w[m2[j]]); 
			if(m3[i]!=0&&m3[j]!=0&&m3[i]!=j&&m3[i]!=m3[j]&&m3[j]!=i) ans=max(ans,ret+w[m3[i]]+w[m3[j]]); 
		} 
	cout<<ans<<endl; 
}

2022/11/13 17:22
加载中...