思路:板子题,直接套模板即可。
/**
* From:
* Qingdao Agricultural University
* Created by XiangwangAcmer
* Date : 2019-10-02-20.59.50
* Talk is cheap.Show me your code.
*/
using namespace std;
const ll maxn = 1e6 + 5;
const ll minn = 1e9 + 5;
const ll mod = 1000000007;
const int INF = 0x3f3f3f3f;
const long long LIMIT = 4294967295LL;
vector<int>v[maxn];
int dp[maxn];
vector<int>G[maxn];
bool row[maxn], col[maxn];
bool flag = 0;
queue<int>q;///spfa///O(M+N)logN.
struct edge {///邻接表的链表实现
int v, w, fail;/// 这条边练的顶点编号 边权 这条边的下一条边在数组中的编号。
edge() {}
edge(int _v, int _w, int _fail) {
v = _v;
w = _w;
fail = _fail;
}
} e[maxn];
int head[maxn], len;///每一个点连出的第一条边
void init() { ///初始化
memset(head, -1, sizeof(head));
len = 0;///当前图中的边数
}
void add(int u, int v, int w) {///插入一条边/从连出的所有的边
e[len] = edge(v, w, head[u]);/// 这条边练的顶点编号 head[u]当前连出第一条边。
head[u] = len++;///修改为len++
}///图论模板多
int n, m;
int dis[maxn];
bool vis[maxn];
void spfa(int u) {
memset(vis, 0, sizeof(vis));
vis[u] = 1; ///判段结点是否在队列中
memset(dis, 0x3f, sizeof(dis)); ///只会截取第一个字节
dis[u] = 0;
queue<int>q;
q.push(u);
while(!q.empty()) {
u = q.front();
q.pop();///1.23
vis[u] = 0;
for(int j = head[u]; ~j; j = e[j].fail) {///j=-1;
int v = e[j].v;
int w = e[j].w;
if(dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;///松弛操作
if(!vis[v]) {
q.push(v);
vis[v] = 1;
}
}
}
}
}
int main() {
ios::sync_with_stdio(false);
init();
int u, v, w;
cin >> n >> m;
while(n--) {
cin >> u >> v >> w;
add(u, v, w);
add(v, u, w);
}
spfa(1);
cout << dis[m] << endl;
return 0;
}