#include<iostream>
#include<algorithm>
using namespace std;
int a[10005][10005];
int dis[10005],n,m,num;
bool flag[10005];
void Dijkstra()
{
int end;
for(int i=1;i<=n-1;i++)
{
int mmin=1e8;
for(int j=1;j<=n;j++)
{
if(!flag[j]&&dis[j]<mmin)
{
mmin=dis[j];
end=j;
}
}
flag[end]=1;
for(int j=1;j<=n;j++)
{
if(a[end][j]<1e8)
{
if(dis[j]>dis[end]+a[end][j])
dis[j]=dis[end]+a[end][j];
}
}
}
}
int main()
{
cout<<"请输入有多少个顶点:";
cin>>n;
for(int i=1;i<=n;i++)
dis[i]=1e8;
cout<<"请输入有多少个有向路径:";
cin>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j)
a[i][j]=0;
else
a[i][j]=1e8;
for(int i=1;i<=m;i++)
{
cout<<"请输入第"<<i<<"条有向路径的起始顶点,终止顶点,两点路径长度:";
int t1,t2,t3;
cin>>t1>>t2>>t3;
a[t1][t2]=t3;
}
cout<<"请输入从哪个顶点开始寻找单源最短路径:";
int start;
cin>>start;
flag[start]=1;
for(int i=1;i<=n;i++)
dis[i]=a[start][i];
Dijkstra();
for(int i=1;i<=n;i++)
cout<<"从"<<start<<"出发,第"<<i<<"个点的最短路径为:"<<dis[i]<<endl;
}