https://ac.nowcoder.com/acm/problem/14292
不就是最短路问题么,看了题解也没看懂,为什么还要分开来算,直接求最短路哪里不对啊o((>ω< ))o,下面是自己写的迪杰斯特拉。
#include<bits/stdc++.h>
#include<iostream>
#include<queue>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N = 52502;
const int INF = 1e9+10;
int h[N],ne[N],e[N],w[N],idx;
int n,m,q;
void add(int a,int b,int c){
w[idx] = c;
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
int dist[N];
bool st[N];
int dj(int s,int se){
memset(st,0,sizeof st);
for(int i=0;i<=N;i++){
dist[i] = INF;
}
priority_queue<PII,vector<PII>,greater<PII> > heap;
dist[s] = 0;
heap.push({0,s});
while(heap.size()){
bool flag = true;
for(int i =1;i<=n;i++){
if(!st[i]){
flag = false ;
break;
}
}
if(flag) break;
auto t = heap.top();
heap.pop();
int ver = t.second , dis = t.first;
if(st[ver]) continue;
st[ver] = true;
for(int i=h[ver] ;i !=- 1; i = ne[i]){
int j=e[i];
if(dist[j]>dis+w[i]){
dist[j] = dis+w[i] ;
heap.push({dist[j],j});
}
}
}
if(dist[se] == INF) return -1;
else return dist[se];
}
int main(){
memset(h,-1,sizeof h);
cin>>n>>m;
for(int i=1 ; i<=n;i++){//无传送门
int k;
cin >> k;
if(i==n){
add(n,1,k);
add(1,n,k);
}
else{
add(i,i+1,k);
add(i+1,i,k);
}
}
for(int i=1;i<=m;i++){
int u,v,w1;
cin>>u>>v>>w1;
if(u == v) continue;
add(u,v,w1);
add(v,u,w1);
}
scanf("%d",&q);
while(q--){
int p1,p2;
cin>>p1>>p2;
cout<<dj(p1,p2)<<endl;
}
// for(int i=h[3];i != -1 ; i = ne[i]){
// cout<<e[i]<<" ";
// }
// cout<<dj(4,3);
return 0;
}