最短路## DIJ
#include<stdio.h>
#include<string.h>
#define MAXN 1000
#define INF 0x3f3f3f
int e[MAXN][MAXN];//存图
int dis[MAXN];//记录起点到i的最长的距离
int book[MAXN];//标记点
int n,m;//n为顶点,m为边
void dij(){
int i,j,k,u,v;
int flag;
memset(book,0,sizeof(book));
for(i=1 ; i<=m ; i++){
dis[i]=e[1][i];
}
book[1]=1;
for(i=1 ; i<=n-1 ; i++)
{
flag=INF;
for(j=1 ; j<=n ; j++)//找到每个过程中距1最近的点
{
if(book[j]==0 && dis[j]<flag)
{
flag=dis[j];
u=j;
}
}
book[u]=1;
for(v=1 ; v<=n ; v++)//进行松弛,判断是否经过转折点使之更小
{
if(e[u][v]<INF)
{
if(dis[v]>dis[u]+e[u][v])
dis[v]=dis[u]+e[u][v];
}
}
}
for(i=1 ; i<=n ; i++)
{
printf("1->%d %d\n",i,dis[i]);//求的是以1为起点的最短路
}
}
int main()
{
int x,y,z;
while(~scanf("%d %d",&n,&m))
{
for(int i=1 ; i<=n ; i++)
for(int j=1 ; j<=n ; j++)
{
if(i == j) e[i][j]=0;
else e[i][j]=INF;
}
for(int i=1 ; i<=m ; i++){
scanf("%d %d %d",&x,&y,&z);
e[x][y]=z;//有向图
}
dijstra();
}
return 0;
}