史东薇尔城 单源最短路
题目描述
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;
}