16pts求调
查看原帖
16pts求调
721959
封禁用户楼主2024/8/4 16:50
//第一眼紫,第二眼绿,第三眼蓝
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){
		f=ch=='-'?-f:f;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return f*x;
}
const int p=1e9+7,N=2505;
int Q,m,X,Y,n;
int f[N][N];
int h[N],ne[N<<1],t[N<<1],w[N<<1],cnt;
void add(int x,int y,int z){
	t[++cnt]=y;
	w[cnt]=z;
	ne[cnt]=h[x];
	h[x]=cnt;
}
int v[N];
int a[N];
vector<int>g[N],sum[N],tre[N];
int tre_sum;
void dfs(int start,int u,int fa,int step){
	if(v[u]==0)tre[tre_sum].push_back(u),v[u]=tre_sum;
	f[start][u]=step;
	for(int e=h[u];e;e=ne[e]){
		if(t[e]==fa)continue;
		dfs(start,t[e],u,step+w[e]);
	}
}
void q(int x){
	memset(a,0,sizeof a);
	int l=tre[x].size();
	for(int i=0;i<l;++i){
		for(int j=0;j<l;++j){
			if(i!=j)++a[min(f[tre[x][i]][tre[x][j]],Y)];
		}
	}
	for(int i=0;i<=Y;++i){
		if(a[i]){
			g[x].push_back(i);
			sum[x].push_back(a[i]);
		}
	}
}
int F[N][N],G[N][N];
signed main(){
 	freopen("P5243_4.in","r",stdin);
//	freopen("track.out","w",stdout);
	Q=read();m=read();X=read();Y=read();
	n=Q-m;
	int st=min(n*X,Y);
	int x,y,z;
	while(m--){
		x=read();y=read();z=read();
		add(x,y,z);add(y,x,z);
	}
	for(int i=1;i<=Q;++i){
		if(!v[i])++tre_sum;
		dfs(i,i,0,0);
	}
	memset(v,0,sizeof v);
	for(int i=1;i<=n;++i)q(i);
	memset(G,-1,sizeof G);
	F[0][st]=X*n;G[0][st]=1;
	for(int i=1;i<=n;++i){
		int l=g[i].size();
		for(int j=0;j<l;++j){
			for(int k=Y;k>=st;--k){
				if(G[i-1][k]!=-1){
					int K=min(k+g[i][j],Y);
					if(G[i][K]==-1)G[i][K]=0;
					G[i][K]+=sum[i][j]*G[i-1][k]%p;
					G[i][K]%=p;
					F[i][K]+=(F[i-1][k]*sum[i][j]%p+g[i][j]*G[i-1][k]%p*sum[i][j]%p)%p;
					F[i][K]%=p;
				}
			}
		}
	}
	int op=1;
	for(int i=2;i<n;++i)op=i*op%p;
	cout<<F[n][Y]%p*op%p*(p+1)/2%p;
}
2024/8/4 16:50
加载中...