社区讨论

求调,谢谢

P1772[ZJOI2006] 物流运输参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mibb0400
此快照首次捕获于
2025/11/23 13:55
3 个月前
此快照最后确认于
2025/11/23 15:30
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int M=25,N=105,INF=4e18;
int n,m,k,e,d,dp[N],cost[N][N],dis[M];
bool able[M][N],cannot[M],fl[M];
vector<pair<int,int>> g[M];

void dij(){
	for(int i=1;i<=m;i++) dis[i]=INF;
	memset(fl,0,sizeof(fl)); 
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
	dis[1]=0;
	q.push({0,1});
	while(!q.empty()){
		int u=q.top().second;
		q.pop();
		if(fl[u] || cannot[u]) continue;
		fl[u]=1;
		for(auto i:g[u]){
			int v=i.first,w=i.second;
			if(cannot[v]) continue; 
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				q.push({dis[v],v});
			}
		}
	}
}

signed main(){
	cin>>n>>m>>k>>e;
	for(int i=1;i<=e;i++){
		int x,y,z;
		cin>>x>>y>>z;
		g[x].push_back({y,z});
		g[y].push_back({x,z});
	}
	cin>>d;
	for(int i=1;i<=d;i++){
		int p,a,b;
		cin>>p>>a>>b;
		for(int j=a;j<=b;j++)
			able[p][j]=1;
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			memset(cannot,0,sizeof(cannot));
			for(int t=i;t<=j;t++)
				for(int x=1;x<=m;x++)
					if(able[x][t]) cannot[x]=1;
			dij();
			cost[i][j]=dis[m];
		}
	}
	
	memset(dp,0x3f,sizeof(dp));
	for(int i=1;i<=n;i++){
		dp[i]=cost[1][i]*i;
		for(int j=i;j>=1;j--)
			dp[i]=min(dp[i],dp[j-1]+cost[j][i]*(i-j+1)+k);
	}
	cout<<dp[n];
	return 0;
}
我的代码总是输出极大值或者极小值,调试了很久也没有看出来问题,可否帮我看一下,谢谢。

回复

0 条回复,欢迎继续交流。

正在加载回复...