Dijkstra30pts求调
查看原帖
Dijkstra30pts求调
467411
Form_mula楼主2024/8/6 22:38

Dijkstra堆优化+dp WA30pts求调(#1,#2,#5对)

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#define MAXN 210
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;

struct edge{
	ll v,w;
};

struct node{
	int inx,dist;
	int path;
	bool operator<(const node& o) const{
		return o.dist<dist;
	}
};

ll n,m,ks,e,d;
ll u[MAXN],v[MAXN],w[MAXN];
ll f[MAXN];
bool flag[30][110];
bool mark[MAXN];
vector<edge> G[MAXN];
priority_queue<node> qp;
node nd[MAXN];
ll at_now[MAXN],cnt;

ll fminn(ll a,ll b){ return a<b?a:b; }

void init(){
	for(int i=1;i<=m;i++){
		nd[i].inx=i;
		nd[i].dist=INF;
		nd[i].path=-1;
	}
	nd[1].dist=0;
	while(!qp.empty()) qp.pop();
	memset(at_now,0,sizeof(at_now));
	memset(mark,false,sizeof(mark));
	cnt=0;
	return ;
}

ll Dijkstra(int now){
	init();
	for(int i=1;i<=m;i++) G[i].clear(),G[i].resize(0);
	for(int i=1;i<=e;i++){
		if(flag[u[i]][now]||flag[v[i]][now]) continue;
		G[u[i]].push_back((edge){v[i],w[i]});
		G[v[i]].push_back((edge){u[i],w[i]});
	}
	qp.push((node){1,0,-1});
	while(!qp.empty()){
		node tk=qp.top();
		qp.pop();
		int k=tk.inx;
		if(mark[k]) continue;
		mark[k]=true;
		for(int i=0;i<(int)G[k].size();i++){
			int ij=G[k][i].v;
			if(G[k][i].w+nd[k].dist<=nd[ij].dist){
				nd[ij].dist=G[k][i].w+nd[k].dist;
				nd[ij].path=k;
				if(!mark[ij]){
					qp.push((node){ij,nd[ij].dist,k});
				}
			}
		}
	}
	return nd[(int)m].dist;
}

void print_path(int ttt){
	//cout<<ttt<<" "<<nd[ttt].path<<endl;
	if(nd[ttt].path!=-1){
		print_path(nd[ttt].path);
	}
	at_now[++cnt]=ttt;
	return ;
}

bool check(int past){
	for(int i=1;i<=cnt;i++){
		if(flag[at_now[i]][past]){
			return true;
		}
	}
	return false;
}

int main(){
	cin>>n>>m>>ks>>e;
	for(int i=1;i<=e;i++){
		cin>>u[i]>>v[i]>>w[i];
		//G[u].push_back((node){v,w});
	}
	cin>>d;
	for(int i=1;i<=d;i++){
		ll p,a,b;
		cin>>p>>a>>b;
		for(int j=a;j<=fminn(b,n);j++){
			flag[p][j]=true;
		}
	}
	f[0]=-ks;
	for(int i=1;i<=n;i++){
		f[i]=INF;
		ll asd=Dijkstra(i);
		int j=i;
		print_path(m);
		while(true){
			if(j==0){
				break;
			}
			if(check(j)){
				break;
			}
			j--;
		}
		f[i]=fminn(f[i],f[j]+(i-j)*asd+ks);
	}
	cout<<f[n];
	return 0;
}
2024/8/6 22:38
加载中...