题目描述
输入
输出
示例输入
3 2
1 2 1
1 3 1
1 0
示例输出
1
0
提示
#include <iostream>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
typedef struct arcnode
{
int adj;
int info;
}arcnode,adjmatrix[101][101];
typedef struct
{
adjmatrix a;
int vn,an;
}MG;
struct node
{
int data;//存储结点;
int step;//最小的路径;
};
int i,j;
int create(MG &g,int n,int m)//邻接矩阵的建立;
{
int v1,v2,w;
g.vn=n;
g.an=m;
for(i=1;i<=g.vn;i++)
for(j=1;j<=g.vn;j++)
if(i==j)
g.a[i][j].adj=0;
else g.a[i][j].adj=INF;//规定不同两点间的距离为无穷大;
for(i=1;i<=g.an;i++)
{
scanf("%d%d%d",&v1,&v2,&w);
if(g.a[v1][v2].adj>w||g.a[v2][v1].adj>w)
g.a[v1][v2].adj=w; //有重复边选权值最小的保存
g.a[v2][v1]=g.a[v1][v2];
}
return 1;
}
void floyd(MG &g)//弗洛伊德算法(找两点间的最小路径);
{
int k;
for(k=1;k<=g.vn;k++)
for(i=1;i<=g.vn;i++)
for(j=1;j<=g.vn;j++)
if(i!=j)
{
if(g.a[i][j].adj>g.a[i][k].adj+g.a[k][j].adj)
g.a[i][j].adj=g.a[i][k].adj+g.a[k][j].adj;
}
}
int main()
{
MG g;
int m,n;
while(~scanf("%d%d",&n,&m))
{
create(g,n,m);
floyd(g);
printf("%d\n",g.a[1][n].adj);
}
return 0;
}