疑惑
查看原帖
疑惑
1404345
zzx20110203楼主2025/1/17 13:53

为什么没RE

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+7;
int diss[4007][4007];
struct node{
	int qwq,dis,use;
};
int n,m,k;
int vis[4007];
int book[4007];
struct jk{
    bool operator()(const node&t1,const node&t2)const{
        return t1.dis>t2.dis; 
    }
};
void djs(){
	priority_queue<node,vector<node>,jk>pq;
	pq.push(node{1,0,0});
	while(!pq.empty()){
		node o=pq.top();
		//cout<<"当前点: "<<o.qwq<<" dis: "<<o.dis<<" use: "<<o.use<<endl; 
		pq.pop();
		vis[o.qwq]=1;
		for(int i=1;i<=n;i++){
			if(!vis[i+o.use*n]&&book[i+o.use*n]>diss[i+o.use*n][o.qwq]+o.dis){
				book[i+o.use*n]=diss[i+o.use*n][o.qwq]+o.dis;
				pq.push(node{i+o.use*n,book[i+o.use*n],o.use});
			}
			if(!vis[i+(o.use+1)*n]&&book[i+(o.use+1)*n]>diss[o.qwq][i+(o.use+1)*n]+o.dis){
				book[i+(o.use+1)*n]=diss[o.qwq][i+(o.use+1)*n]+o.dis;
				pq.push(node{i+(o.use+1)*n,book[i+(o.use+1)*n],o.use+1});
			}
		}
	}
	return ;
}
int main(){
	cin>>n>>m>>k;
	for(int i=0;i<=4000;i++){
		for(int j=0;j<=4000;j++){
			diss[i][j]=maxn;
		}
	}
	for(int i=0;i<=4000;i++){
		diss[i][i]=0;
		book[i]=maxn;
	}
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		for(int j=0;j<=k;j++){
			diss[j*n+u][j*n+v]=w;
			diss[j*n+v][j*n+u]=w;
		}
		for(int j=0;j<k;j++){
			diss[j*n+u][(j+1)*n+v]=w/2;
			diss[j*n+v][(j+1)*n+u]=w/2;
		}
	}
	djs();
	int ans=maxn;
	for(int i=0;i<=k;i++){
		ans=min(ans,book[i*n+n]);
	}
	cout<<ans;
	return 0;
}

vis[]数组明显开小了,却没RE

记录

2025/1/17 13:53
加载中...