#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<set>
#include<cmath>
#include<stdlib.h>
#include<map>
#include<algorithm>
#include<cstring>
using namespace std;
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define sca(x) scanf("%d",&x)
#define pb(x) push_back(x)
#define per(i,j,k) for(int i=j;i>=k;i--)
#define inf 0x3f3f3f3f
#define LL long long
#define N 10005
#define maxn 1000005
#define inf 0x3f3f3f3
struct node
{
int to,w,nt;
}g[N];
int head[N];
int tot;
void add(int u,int v,int w)
{
g[tot].to=v;
g[tot].w=w;
g[tot].nt=head[u];
head[u]=tot++;
g[tot].to=u;
g[tot].w=w;
g[tot].nt=head[v];
head[v]=tot++;
}
struct node1
{
int w,u;
friend bool operator <(node1 x,node1 y)
{
return x.w>y.w;
}
};
priority_queue<node1 >q;
int dis[N],vis[N];
void dijkstar(int s,int t,int n)
{
memset(vis,0,sizeof(vis));
rep(i,0,n-1)dis[i]=inf;
dis[s]=0;
node1 tmp={0,s};
q.push(tmp);
while(!q.empty())
{
node1 tmp2=q.top();
int u=tmp2.u;
q.pop();
if(vis[u]==1)continue;
vis[u]=1;
for(int i=head[u];i!=-1;i=g[i].nt)
{
int to=g[i].to;
int w=g[i].w;
if(!vis[to]&&dis[to]>dis[u]+w)
{
dis[to]=dis[u]+w;
q.push(node1{dis[to],to});
}
}
}
printf("%d\n",dis[t]==inf?-1:dis[t]);
}
int main()
{
int n,m;
while(cin>>n>>m){
tot=0;
memset(head,-1,sizeof(head));
rep(i,1,m)
{
int x,y,k;
cin>>x>>y>>k;
add(x,y,k);
}
int s,t;
cin>>s>>t;
dijkstar(s,t,n);
}
}
缺点:无法处理负权边
未完待续。。