三十分求助QAQ
查看原帖
三十分求助QAQ
394672
Alan_chaser楼主2021/10/7 17:31
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int n,m,k,e,head[N];
struct FF{
	int next,f,w,to;
}len[N];
struct FFk{
	int l,r;
}po[N];
int day[2100][2100],dp[N],d;
void init(){
	int tot=0,x,y,z;
	scanf("%lld%lld%lld%lld",&n,&m,&k,&e);
	for(int i=1;i<=e;i++){
		scanf("%lld%lld%lld",&x,&y,&z);
		len[++tot].to=y,len[tot].f=x,len[tot].next=head[x],len[tot].w=z,head[x]=tot;
		len[++tot].to=x,len[tot].f=y,len[tot].next=head[y],len[tot].w=z,head[y]=tot;
	}
	for(int i=1;i<=n;i++)po[i].l=-1,po[i].r=-1;
	scanf("%lld",&d);
	for(int i=1;i<=d;i++){
		scanf("%lld",&x);
		scanf("%lld%lld",&po[x].l,&po[x].r);
	}
	return;
}
int SPFA(int l,int r){
	int dis[5000];bool vis[5000];
	for(int i=1;i<=m;i++)dis[i]=1000000000000;
	memset(vis,0,sizeof(vis));
	dis[1]=0,vis[1]=1;
	queue<int> q;q.push(1);
	while(!q.empty()){
		int u=q.front();q.pop();vis[u]=0;
		for(int i=head[u];i;i=len[i].next){
			int f=len[i].f,to=len[i].to,w=len[i].w;
			if(po[to].l>r ||  po[to].r<l){
				if(dis[to]>dis[u]+w){
					if(!vis[to])q.push(to);
					dis[to]=dis[u]+w;vis[to]=1;
				}
			}
		}
	}
	return dis[m];
}
signed main(){
	init();
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++)
			day[i][j]=SPFA(i,j);
	}
	dp[0]=-k;
	/*for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++)
			printf("%lld ",day[i][j]);puts(" ");
	}*/
	for(int i=1;i<=n;i++)
		dp[i]=100000000000000;
	for(int i=1;i<=n;i++){
		dp[i]=i*day[1][i];
		for(int j=i-1;j>=0;j--)
			dp[i]=min(dp[j]+day[j+1][i]*(i-j)+k,dp[i]);
	}
	cout<<dp[n];
	/*for(int i=1;i<=n;i++)
		printf("%lld %lld\n",po[i].l,po[i].r);
	for(int i=1;i<=n;i++)
		printf("%lld ",day[i][i]);*/
	return 0;
}
2021/10/7 17:31
加载中...