题意
求从1到n的最短路
思路
模板题,直接Dijkstra跑起。
代码
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
const long long maxn = 1e5+10;
const long long mod = 1e9+13;
struct edge{
long long v,to,cost;
edge(long long t,long long c):to(t),cost(c){};
edge(long long v, long long t,long long c):v(v),to(t),cost(c){};
bool operator < (const edge & a) const{
return cost > a.cost;
}
};
vector <edge> G_a[maxn];
vector <edge> e;
void addedge(long long from, long long to, long long cost){
G_a[from].push_back(edge(to, cost));
G_a[to].push_back(edge(from, cost));
}
long long dis_a[maxn];
long long n;
void Dijkstra(long long s, long long dis[]){
for (long long i = 0 ; i <= n ; i ++){
dis[i] = INF;
}
dis[s] = 0;
priority_queue<edge> Q;
Q.push(edge(s,dis[s]));
while(!Q.empty()){
edge tmp = Q.top();Q.pop();
long long limt = G_a[tmp.to].size();
for(long long i = 0 ; i < limt; i ++){
edge& next = G_a[tmp.to][i];
if(dis[next.to] > tmp.cost + next.cost){
dis[next.to] = tmp.cost + next.cost;
Q.push(edge(next.to,dis[next.to]));
}
}
}
}
int main(){
long long s,t;
scanf("%I64d %I64d",&t,&n);
long long from, to, cos;
for (long long i = 0 ; i < t ; i ++){
scanf("%I64d %I64d %I64d",&from,&to,&cos);
addedge(from,to,cos);
e.push_back(edge(from,to,cos));
}
Dijkstra(n,dis_a);
printf("%d\n",dis_a[1]);
}