题目链接
AC代码:
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
#define N 1010
#define inf 0x3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
ll dis[N],vis[N];
ll Map[N][N];
void dj(ll n)
{
ll k,Min;
for(ll i=1;i<=n;i++)
{
dis[i]=Map[1][i];
vis[i]=0;
}// 初始化
for(ll i=1;i<=n;i++)
{
k=-1;
Min=inf;
for(ll j=1;j<=n;j++)
{
if(!vis[j]&&Min>dis[j])
{
Min=dis[j];
k=j;
}
}
vis[k]=1;
for(ll j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]>dis[k]+Map[k][j])
{
dis[j]=dis[k]+Map[k][j];
}
}
}
return ;
}
int main()
{
ll t,n;
while(cin>>t>>n)// t为边数 n为顶点数
{
mem(Map,0);
mem(dis,0);
mem(vis,0);
for(ll i=1;i<=n;i++)
for(ll j=1;j<=n;j++)
Map[i][j]=inf;//初始化
for(ll i=1;i<=t;i++)
{
ll a,b,w;
cin>>a>>b>>w;
if(w<Map[a][b])
{
Map[a][b]=w;
Map[b][a]=w;
}//这里很重要:判断两点之间是否有重边
}
dj(n);
cout<<dis[n]<<endl;
}
}