20pts 分层图,求助
查看原帖
20pts 分层图,求助
868864
zjinze楼主2023/11/11 16:03
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF=1e17;
int n,p,k,a,b,l;
vector< pair<int,int> >ve[1000003]; 
int dis[1000003];
bool st[1000003];
priority_queue< pair<int,int> >que;
void work(){
	for(int i=1;i<=(k+1)*n;i++){
		dis[i]=INF;
		st[i]=0;
	}
	que.push(make_pair(0,1));
	dis[1]=0;
	while(!que.empty()){
		int u=que.top().second;
		que.pop();
		if(st[u])continue;
		st[u]=1;
		for(int j=0;j<ve[u].size();j++){
			int to=ve[u][j].first;
			int w=ve[u][j].second;
			if(dis[to]>max(dis[u],w)){
				dis[to]=max(dis[u],w);
				if(st[to]==false){
					que.push(make_pair(-dis[to],to));
				}
			}
		}
	}
}
signed main(){
//	freopen("P1948_1.in","r",stdin);
//	freopen("P1948_1.ans","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>p>>k;
	for(int i=1;i<=p;i++){
		cin>>a>>b>>l;
		ve[a].push_back(make_pair(b,l));
		ve[b].push_back(make_pair(a,l));
		for(int j=1;j<=k;j++){
			ve[a+j*n].push_back(make_pair(b+j*n,l));
			ve[b+j*n].push_back(make_pair(a+j+n,l));
			ve[a+j*n-n].push_back(make_pair(b+j*n,0));
			ve[b+j*n-n].push_back(make_pair(a+j*n,0));
		}
	}
	work();
	int ans=INF;	
	for(int i=0;i<=k;i++){
		ans=min(ans,dis[n+i*n]);
	}
	if(ans==INF)ans=-1;
	cout<<ans;
	return 0;
}
2023/11/11 16:03
加载中...