一种不同的做法求调!!!!!!
查看原帖
一种不同的做法求调!!!!!!
1382982
jikky楼主2024/10/22 20:23
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,k;
const int inf=1e9+10;
struct E{
	int ne;
	int v;
	int w;
}e[N];
int tot=0;
int head[N];
bool b[N];
struct NODE{
	int id;
	int num;
}dis[N];

struct cmp{
	bool operator()(NODE a,NODE b){
		if(a.num<b.num){
			return 1;
		}
		else{
			return 0;
		}
	}
};

void add(int u,int v,int w){
	e[++tot].ne=head[u];
	e[tot].v=v;
	e[tot].w=w;
	head[u]=tot;
}
priority_queue<NODE,vector<NODE>,cmp> q;

void dfs(int u,int fa,int deep){
	if(deep<=k){
		dis[u].num=0;
		//b[u]=1;
		b[u]=1;
		if(deep==k){
			b[u]=0;
			q.push(dis[u]);
		}
	}
	
	for(int i=head[u];i;i=e[i].ne){
		if(e[i].v!=fa){
			if(deep<k){
				e[i].w=0;
				dfs(e[i].v,u,deep+1);
			}
		}
	}
}

void find(int u){
	q.pop();
	for(int i=head[u];i;i=e[i].ne){
		if(!b[e[i].v]&&dis[e[i].v].num>dis[u].num+e[i].w){
			dis[e[i].v].num=dis[u].num+e[i].w;
			q.push(dis[e[i].v]);
			//cout<<222<<endl;
		}
	}
}

int main(){
	cin>>n>>m>>k;
	int s,t;
	cin>>s>>t;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
	}
	for(int i=1;i<=n;i++){
		dis[i].num=inf;
		dis[i].id=i;
	}
	dis[s].num=0;
	dfs(s,0,0);
	while(!q.empty()){
		//cout<<111<<endl;
		if(!b[q.top().id]){
			//cout<<333<<endl;
			b[q.top().id]=1;
			find(q.top().id);
		}
		else{
			q.pop();
		}
	}
	cout<<dis[t].num;
	return 0;
}
2024/10/22 20:23
加载中...