求助(help)
查看原帖
求助(help)
1072440
Kevin__Jun楼主2025/6/29 22:04

全RE,QWQ

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 1100
const ll inf=0x3f;
ll n,m,g,o,d,tot;
ll f[MAXN],c[MAXN][MAXN];
ll dis[MAXN],h[MAXN];
bool flag[MAXN],cl[MAXN][MAXN],vis[MAXN];
struct node{
	ll nxt,to,dis;
}e[4*MAXN];
void add(ll u,ll v,ll w) {
	e[++tot].nxt=h[u];
	e[tot].to=v;
	e[tot].dis=w;
	h[u]=tot;
}
bool spfa() {
	queue <ll> q;
	for(ll i=1;i<=m;i++) {
		dis[i]=inf;
		vis[i]=0;
	}
	q.push(1);
	dis[1]=0,vis[1]=1;
	while(!q.empty()) {
		ll u=q.front();
		q.pop();
		vis[u]=0;
		for(ll i=h[u];i;i=e[i].nxt) {
			ll v=e[i].to;
			if(flag[v]) continue;
			if(dis[v]>dis[u]+e[i].dis) {
				dis[v]=dis[u]+e[i].dis;
				if(!vis[v]) {
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}
}
int main() {
	scanf("%lld%lld%lld%lld",&n,&m,&g,&o);
	for(ll i=1,u,v,w;i<=o;i++) {
		scanf("%lld%lld%lld",&u,&v,&w);
		add(u,v,w);
		add(v,u,w);
	}
	scanf("%lld",&d);
	for(ll i=1,p,x,y;i<=d;i++) {
		scanf("%lld%lld%lld",&p,&x,&y);
		for(ll j=x;j<=y;j++) 
			cl[p][j]=1;
	}
	//跑多遍spfa
	for(ll i=1;i<=n;i++) 
		for(ll j=1;j<=n;j++) {
			//把空标记为1;
			memset(flag,0,sizeof flag);
			 for(ll k=i;k<=j;k++) 
				for(ll t=1;t<=m;t++)
					 if(cl[t][k]) flag[t]=1;
			spfa();
			c[i][j]=dis[m];
		} 
	memset(f,inf,sizeof f);
	for(ll i=1;i<=n;i++) {
		f[i]=c[1][i]*i;
		for(ll j=n-1;j>=0;j--) {
			f[i]=min(f[i],f[j]+c[j+1][i]*(i-j)+g);
		}
	}
	printf("%lld",f[n]);
	return 0;
}
2025/6/29 22:04
加载中...