题目描述
输入
输出
示例输入
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;
 }