史东薇尔城 单源最短路

题目描述
LOST GRACE DISCOVERED
史东薇尔城坐落于宁姆格福与利耶尼亚湖的交界处,地势险要、易守难攻,是连接南北重要的交通枢纽。史东薇尔城不仅地理位置重要,内部更是错综复杂,第一次来到这里的褪色者往往会迷路。魔法师MaverickFW接手了大量的来自史东薇尔城的任务委托,每一次执行任务MaverickFW都需要从自己当前的所在地去往史东薇尔城再跑去任务地点。我们将地图简化为一张无向图,而史东薇尔城是一号结点。MaverickFW想知道自己每次任务最短需要跑多远,他每次会告诉你自己当前所在结点与任务地所在结点,希望你能准确回答他。
输入描述:
第一行两个正整数n,mn,m表示结点数与边数

接下来mm行,每行三个正整数v_i,w_i,d_iv
i

,w
i

,d
i

,表示v_iv
i

到w_iw
i

的距离为d_id
i

接下来一行一个整数TT,表示询问次数

之后TT行,每行两个正整数s_i,t_is
i

,t
i

,表示MaverickFW的出发点与任务点
输出描述:
对于每一个询问输出一行一个正整数表示最短距离
示例1
输入
复制
3 3
1 2 1
1 3 1
2 3 1
3
1 3
2 3
1 2
输出
复制
1
2
1

它卡int,光dist设置为long long 还不行,还要连存图的邻接表一起设置为long long ,以后参加比赛直接放弃使用int ,一律使用ll
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N=1e6+5,M=5e6+5;
int h[N],e[M],w[M],ne[M],idx;
ll dist[N];
bool st[N];
int n,m;

void add(int a,int b,int c)
{
	e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++;
}
class node
{
	public :
		ll x,w;
		node(){
		}
		node(ll a,ll b){
			x=a;w=b;
		}
		bool operator <(const node & b) const 
		{
			return w>b.w;
		}
};
void dijkstra(int u)
{
	priority_queue<node> q;
	dist[u]=0;
	q.push(node(u,0));
	
	while(!q.empty())
	{
		node t=q.top();q.pop();
		if(st[t.x])continue;
		st[t.x]=true;
		for(int i=h[t.x];i!=-1;i=ne[i]){
			int j=e[i];
			if(dist[j]>t.w+w[i])
			{
				dist[j]=t.w+w[i];
				q.push(node(j,dist[j]));
			}
		}
	}
}

int main(){
	cin>>n>>m;
	memset(h,-1,sizeof h);
    memset(dist,0x3f,sizeof dist);
	for(int i=0;i<m;++i)
	{
		int a,b,c;
		cin>>a>>b>>c;
		add(a,b,c); add(b,a,c);
	}
	
	dijkstra(1);
	int t;cin>>t;
	while(t--)
	{
		int x,y;
		cin>>x>>y;
		cout<<dist[x]+dist[y]<<endl;
	}
	
	return 0;
} 
posted @ 2022-11-17 23:02  林动  阅读(28)  评论(0编辑  收藏  举报