样例数据全对,提交0pts代码求调
查看原帖
样例数据全对,提交0pts代码求调
232796
Deson楼主2022/11/3 23:23

麻烦各位大佬了,样例数据全是对的。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
typedef pair<int,int>Pair;
priority_queue <Pair,vector<Pair>,greater<Pair> > q;
struct nds{
	int nxt,val,c;
}e[maxn];
int lk[maxn],ltp;
void ist(int x,int y){
	e[++ltp] = {lk[x],y,1};
	lk[x] = ltp;
	e[++ltp] = {lk[y],x,1};
	lk[y] = ltp;
}
int dp[2505][2505];
long long val[2505];
void dijkstra(int s,int n){
	dp[s][s] = 0;
    q.push(Pair(0,s));
	while(!q.empty()){
		Pair p = q.top();
		q.pop();
		int v = p.second;
    	if(dp[s][v]<p.first){
    		continue ;
    	}    	
    	for(int i=lk[v];i;i = e[i].nxt){
    		if(dp[s][e[i].val] == -1){
    			dp[s][e[i].val] = dp[s][v]+e[i].c;
//    			dp[e[i].val][s] = dp[s][e[i].val] ;
    			q.push(Pair(dp[s][e[i].val],e[i].val));
    		}
    		if(dp[s][e[i].val]>dp[s][v]+e[i].c){
    			dp[s][e[i].val]=dp[s][v]+e[i].c;
//    			dp[e[i].val][s] = dp[s][e[i].val] ;
    			q.push(Pair(dp[s][e[i].val],e[i].val));
    		} 
    	}
	}
	return ;
}
bool mp[2505][2505];
long long ans[2505][10];
void bfs(int x,int depth,int n){
	if(depth == 5){
		return ;
	}
	for(int i=1;i<=n;i++){
		if(x==i)continue;
		if(mp[x][i]){
			if(ans[i][depth+1]<=ans[x][depth]+val[i]){
				if(i == 1&&depth<4){
						continue ;
				}
				ans[i][depth+1] = ans[x][depth]+val[i];
				int tmp = val[x];
				val[x] = 0;
				bfs(i,depth+1,n);
				val[x] = tmp;
			}
		}
	} 
}
int main(){
	int n,m,k;
	memset(dp,-1,sizeof(dp));
	cin >> n >> m >> k;
	for(int i=2;i<=n;i++){
		cin >> val[i];
	}
	for(int i=1;i<=m;i++){
		int l,r;
		cin >> l >> r;
		ist(l,r);
	}
	//找出所有边小于k的节点 
	for(int i=1;i<=n;i++){
		dijkstra(i,n); 
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i == j)continue; 
			if(dp[i][j]<=k+1){
				mp[i][j] = 1;
			}
			else{mp[i][j] = 0;}
		}
	}
	bfs(1,0,n);
	cout << ans[1][5];
	return 0;
} 
2022/11/3 23:23
加载中...