好久不写dijkstra ,差点又忘了
逐个点更新
#include<iostream>
#include<cstring>
using namespace std;
int t,n;
int sum;
int a[1006][1005];
int cost[1006];
int vis[1006];
const int inf = 0x3f3f3f3f;
void dijkstra()
{
int i,j;
for(i=1;i<=n;i++)
cost[i]=a[1][i];
cost[1]=0;
vis[1]=1;
int k;
for(k=1;k<n;k++)
{
int minn=inf;
int u=0;
for(i=1;i<=n;i++)
{
if(!vis[i]&&minn>cost[i])
{
minn=cost[i];
u=i;
}
}
vis[u]=1;
if(minn==inf)
continue ;
for(j=1;j<=n;j++)
{
if(!vis[j]&&a[u][j]!=inf&&a[u][j]+cost[u]<cost[j])
{
cost[j]=a[u][j]+cost[u];
}
}
}
}
int main()
{
cin>>t>>n;
int i,j;
int x,y,z;
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
for(i=0;i<t;i++)
{
cin>>x>>y>>z;
if(a[x][y]==0||a[x][y]>z)
a[x][y]=a[y][x]=z;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]==0)
a[i][j]=inf;
dijkstra();
cout<<cost[n]<<endl;//一定有解
}