就前两个点WA了,求助
查看原帖
就前两个点WA了,求助
599287
_masppy_楼主2023/9/13 21:57
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e3+10;
int n,m,k,e,d,tot=0;
struct node{
	int p,l,r;
}q[maxn];
ll cost[maxn][maxn],close1[maxn][maxn],value[maxn],dp[maxn];
vector< pair<ll,ll> > edge[maxn];

ll dis[maxn],vis[maxn];
void Dijkstra(int s){
    for(int i=1;i<=n;i++){
        dis[i]=pow(2,31)-1;
    }
    dis[s]=0;
    priority_queue< pair<ll,ll> >heap;
    heap.push(make_pair(0,s));
    while(heap.size()){
        ll u=heap.top().second;
        heap.pop();
        vis[u]=1;
        int siz=edge[u].size();
        for(int i=0;i<siz;i++){
            long long v=edge[u][i].first;
            if(vis[v]) continue;
            if(dis[v]>dis[u]+edge[u][i].second){
                dis[v]=dis[u]+edge[u][i].second;
                heap.push(make_pair(-dis[v],v));
            }
        }
    }
}

int main(){
	scanf("%d%d%d%d",&n,&m,&k,&e);
	
	for(int i=1;i<=e;i++){
		ll u,v,w;
		scanf("%lld%lld%lld",&u,&v,&w);
		edge[u].push_back(make_pair(v,w));
		edge[v].push_back(make_pair(u,w));
	}
	
	scanf("%d",&d);
	for(int i=1;i<=d;i++){
		scanf("%d%d%d",&q[i].p,&q[i].l,&q[i].r);
		for(int j=q[i].l;j<=q[i].r;j++){
			close1[q[i].p][j]=1;
		}
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			memset(vis,0,sizeof(vis));
			for(int r=i;r<=j;r++){
				for(int l=1;l<=m;l++){
					if(close1[l][r]) vis[l]=1; 
				}
			}
			Dijkstra(1);
			//cout<<dis[m]<<endl;
			cost[i][j]=dis[m];
		}
	}
	
	memset(dp,0x7f,sizeof(dp));
	for(int i=1;i<=n;i++){
		dp[i]=cost[1][i]*i;
		for(int j=i-1;j>=0;j--){
			dp[i]=min(dp[i],dp[j]+cost[j+1][i]*(i-j)+k);
		}
	}
	
	printf("%lld",dp[n]);
	return 0;
}

2023/9/13 21:57
加载中...