dij 80分求卡常
  • 板块P1119 灾后重建
  • 楼主wjr_jok
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/11/25 21:07
  • 上次更新2024/11/26 08:21:59
查看原帖
dij 80分求卡常
1236806
wjr_jok楼主2024/11/25 21:07
#include<bits/stdc++.h>
using namespace std;
const int N=2e2+1,M=1e5+1;
struct jgt{
	int x,y;
	bool operator < (const jgt & a) const{
		return y>a.y;
	}
};
int n,m,q,cnt,x,y,w;
int t[N],flag[M],cc[N],cj[N],dis[N][N][N];
vector<pair<int,int> > lj[N];
priority_queue<jgt> d;
int main(){
	scanf("%d%d",&n,&m);
	if(n)
	for(int i=1;i<=n;i++){
		scanf("%d",&t[i]);
		if(!flag[t[i]]){
			flag[t[i]]=1;
			cc[++cnt]=t[i];
		}
	}
	sort(cc+1,cc+cnt+1);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&w);
		lj[x+1].push_back({y+1,w});
		lj[y+1].push_back({x+1,w});
	}
	for(int i=1;i<=cnt;i++){
		for(int j=1;j<=n;j++){
			cj[j]=(t[j]<=cc[i]);
		}
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				dis[i][j][k]=INT_MAX;
			}
		}
		for(int j=1;j<=n;j++){
			if(!cj[j]){
				continue;
			}
			dis[i][j][j]=0;
			d.push({j,0});
			while(!d.empty()){
				jgt zx=d.top();
				d.pop();
				if(dis[i][j][zx.x]!=zx.y){
					continue;
				} 
				for(int l=0;l<lj[zx.x].size();l++){
					if(cj[lj[zx.x][l].first]&&dis[i][j][lj[zx.x][l].first]>dis[i][j][zx.x]+lj[zx.x][l].second){
						dis[i][j][lj[zx.x][l].first]=dis[i][j][zx.x]+lj[zx.x][l].second;
						d.push({lj[zx.x][l].first,dis[i][j][lj[zx.x][l].first]});
					}
				}
			}
		}
	}
	cin>>q;
	for(int i=1;i<=q;i++){
		scanf("%d%d%d",&x,&y,&w);
		x++,y++;
		if(t[x]>w||t[y]>w){
			printf("-1\n");
			continue;
		}
		for(int j=cnt;j>=1;j--){
			if(w>=cc[j]){
				if(dis[j][x][y]!=INT_MAX){
					printf("%d\n",dis[j][x][y]);
				}
				else{
					printf("-1\n");
				}
				break;
			}
		}
	}
	return 0;
}
2024/11/25 21:07
加载中...