64pts TLE on #3,#4,#7,#8
查看原帖
64pts TLE on #3,#4,#7,#8
1061770
technology_s楼主2024/7/22 19:02

分层图dij

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int to[N<<1],nxt[N<<1],bgn[N],e=0,w[N<<1];
void add(int x,int y,int z){
	e++,to[e]=y,w[e]=z;
	nxt[e]=bgn[x],bgn[x]=e;
}int n,m,k,s,t,u,v,z,ret=0x3f3f3f3f,dis[N][20],vis[N][20];
struct node{
	int id,how_many,val;
};
bool operator < (node a,node b){
	return a.val>b.val;
}priority_queue<node>q;
void dijkstra(int s){
	memset(vis,0,sizeof(vis));
	memset(dis,0x3f3f3f3f,sizeof(dis));
	dis[s][0]=0;
	q.push((node){s,0,0});
	while(!q.empty()){
		node tmp=q.top();
		q.pop();
		int x=tmp.id,now_many_used=tmp.how_many;
		if(vis[x][now_many_used]){
			continue;
		}vis[x][now_many_used]=1;
		for(int j=bgn[x];j;j=nxt[j]){
			int y=to[j],z=w[j];
			if(dis[y][now_many_used]>dis[x][now_many_used]+z){
				dis[y][now_many_used]=dis[x][now_many_used]+z;
				q.push((node){y,now_many_used,dis[y][now_many_used]});
			}if(now_many_used<k&&dis[y][now_many_used+1]>dis[x][now_many_used]){
				dis[y][now_many_used+1]=dis[x][now_many_used];
				q.push((node){y,now_many_used+1,dis[y][now_many_used+1]});
			}
		}
	}
}int main(){
	scanf("%d%d%d",&n,&m,&k);
	scanf("%d%d",&s,&t);
	s++,t++;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&u,&v,&z);
		u++,v++;
		add(u,v,z);
		add(v,u,z);
	}dijkstra(s);
	for(int i=0;i<=k;i++){
		ret=min(ret,dis[t][i]);
	}printf("%d",ret);
	return 0;
}
2024/7/22 19:02
加载中...