60分求助QAQ
查看原帖
60分求助QAQ
102028
初嫁QAQ楼主2020/9/8 19:41
# include <iostream>
# include <cstdio>
# include <queue>
# include <cmath>
# include <cstring>
# define ll long long
using namespace std;
queue<int> q;
int n,m,k,e,d,cnt;
int h[21],nxt[1001000],to[1001000];
ll w[1001000],mon[110][110],f[110],dis[21];
bool vis1[21][110],vis2[21];
void add(int x,int y,ll z){
	nxt[++cnt]=h[x];
	h[x]=cnt;
	to[cnt]=y;
	w[cnt]=z;
}
ll spfa(int l,int r){
	for(int i=1;i<=n;i++)
		dis[i]=1738007481131,vis2[i]=0;
	dis[1]=0;
	q.push(1);
	while(!q.empty()){
		int x=q.front();q.pop();
		vis2[x]=0;
		for(int i=h[x];i;i=nxt[i]){
			int y=to[i];
			bool flag=0;
			for(int j=l;j<=r;j++){
				if(vis1[y][j]){
					flag=1;
					break;
				} 
			}
			if(flag) continue;
			if(dis[y]>dis[x]+w[i]){
				dis[y]=dis[x]+w[i];
				if(!vis2[y]){
					vis2[y]=1;
					q.push(y);
				}
			}
		}
	}
	return dis[m];
}
int main(){
	scanf("%d%d%d%d",&n,&m,&k,&e);
	for(int i=1;i<=e;i++){
		int a,b;
		ll c;
		scanf("%d%d%lld",&a,&b,&c);
		add(a,b,c),add(b,a,c);
	}
	scanf("%d",&d);
	for(int i=1;i<=d;i++){
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		for(int j=b;j<=c;j++)
			vis1[a][j]=1;
	}
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++)
			mon[i][j]=spfa(i,j);
	memset(f,122,sizeof(f));
	for(int i=1;i<=n;i++)
		f[i]=mon[1][i]*i;
	for(int i=1;i<=n;i++)
		for(int j=1;j<i;j++)
			if(f[i]>f[j]+k+mon[j+1][i]*(i-j))
				f[i]=f[j]+k+mon[j+1][i]*(i-j);
	printf("%lld\n",f[n]);
	return 0;
}
2020/9/8 19:41
加载中...