题意:
从1到n,有m条边,问最短多长能到
思路:
裸dijkstra
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
#define maxn 10005
#define INF 0x3f3f3f3f
int dis[maxn];
int mp[maxn][maxn];
int vis[maxn];
int n,m;
void dijkstra(int cur,int ed)
{
for(int i=1;i<=n;i++)
{
vis[i]=0;
dis[i]=mp[cur][i];
}
dis[cur]=0;
vis[cur]=1;
int minn;
int index=cur;
for(int i=1;i<=n;i++)
{
minn=INF;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]<minn )
{
index=j;
minn=dis[j];
}
}
vis[index]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]>mp[index][j]+dis[index])
{
dis[j]=mp[index][j]+dis[index];
}
}
}
cout<<dis[ed]<<endl;
}
int main()
{
cin>>m>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mp[i][j]=INF;
for(int i=0;i<m;i++)
{
int x,y,val;
cin>>x>>y>>val;
if(mp[x][y]>val)
{
mp[x][y]=val;
mp[y][x]=val;
}
}
dijkstra(1,n);
return 0;
}