利用贪心的思想:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
const int INF = 0x7f7f7f7f;
int root[maxn][maxn],dis[maxn],vis[maxn];
int n,m,s,t;
void dijk(int s)
{
for(int i = 1;i<=n;i++)
dis[i] = root[s][i];
dis[s] = 0;
vis[s] = 1;
for(int i = 1;i<n;i++)
{
int min = INF,pos;
for(int j = 1;j<=n;j++)
{
if(!vis[j]&&dis[j]<min)
{
min = dis[j];
pos = j;
}
}
if(min == INF)
break;
vis[pos] = 1;
for(int j = 1;j<=n;j++)
{
if(!vis[j]&&dis[pos]+root[pos][j]<dis[j])
dis[j] = dis[pos]+root[pos][j];
}
}
}
int main()
{
while(cin>>n>>m>>s>>t)
{
memset(vis,0,sizeof(vis));
memset(root,0,sizeof(root));
for(int i = 0;i<maxn;i++)
{
for(int j = 0;j<maxn;j++)
{
if(i!=j)
root[i][j] = INF;
}
}
int u,v,len;
for(int i = 0;i<m;i++)
{
cin>>u>>v>>len;
root[u][v] = root[v][u] = min(root[u][v],len);
}
dijk(s);
cout<<dis[t]<<endl;
}
return 0;
}