纯模板题,套个链式前向星和spfa模板就过了
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
const int maxn=4010;
const int INF=0x3f3f3f3f;
struct Node {
int to,val,next;
} edge[maxn];
int head[1010],cnt=0,dis[1010];
void init() {
memset(head,-1,sizeof head);
}
void addedge(int from,int to,int val) {
edge[cnt].to=to;
edge[cnt].val=val;
edge[cnt].next=head[from];
head[from]=cnt++;
}
bool spfa(int s,int n,int head[],Node edge[],int dist[]) {
queue<int> q;
int inq[1010];
for(int i=0; i<=n; i++) {
dis[i]=INF;
inq[i]=0;
}
dis[s]=0;
q.push(s);
inq[s]++;
while(!q.empty()) {
int temp=q.front();
q.pop();
inq[temp]--;
if(inq[temp]>n)
return false;
for(int i=head[temp]; i!=-1; i=edge[i].next) {
if(dist[edge[i].to]>dist[temp]+edge[i].val) {
dist[edge[i].to]=dist[temp]+edge[i].val;
if(!inq[edge[i].to]) {
inq[edge[i].to]++;
q.push(edge[i].to);
}
}
}
}
return true;
}
int main(void) {
#ifndef ONLINE_JUDGE
freopen("E:\\input.txt","r",stdin);
#endif
int n,m;
cin>>m>>n;
init();
for(int i=0; i<m; i++) {
int t1,t2,t3;
cin>>t1>>t2>>t3;
addedge(t1,t2,t3);
addedge(t2,t1,t3);
}
spfa(1,n,head,edge,dis);
cout<<dis[n]<<endl;
return 0;
}