图结构练习——最短路径

来源:互联网 发布:数控仿真模拟软件 编辑:程序博客网 时间:2024/05/29 15:27

图结构练习——最短路径

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic

Problem Description

 给定一个带权无向图,求节点1到节点n的最短路径。
 

Input

 输入包含多组数据,格式如下。
第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)
剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。
 

Output

 每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)
 

Example Input

3 21 2 11 3 11 0

Example Output

10

Hint

 
#include <stdio.h>
#include <string.h>
int gp[120][120];
int dist[120];
int path[120];
int n,m;
void dista()
{
   int v[110],i,j;
   for(i=1;i<=n;i++)
   {
       dist[i]=gp[1][i];
       if(i!=1&&dist[i]<0x3f3f3f)
       {
           path[i]=1;
       }
       else
       {
           path[i]=-1;
       }
   }
   memset(v,0,sizeof(v));
   v[1]=1;
   dist[1]=0;
   for(i=2;i<=n;i++)
   {
       int min=0x3f3f3f;
       int k=1;
       for(j=1;j<=n;j++)
       {
           if(!v[j]&&dist[j]<min)
           {
               min=dist[j];
               k=j;
           }
       }
       v[k]=1;
              for(j=1;j<=n;j++)
       {
           if(!v[j]&&dist[k]+gp[k][j]<dist[j])
           {
               dist[j]=dist[k]+gp[k][j];
               path[j]=k;
           }
       }


   }
}
int main()
{
    int i,j;
    while(~scanf("%d%d",&n,&m))
    {
          for(i=1;i<=n;i++)
    {
       for(j=1;j<=n;j++)
       {
           if(i==j)
           {
               gp[i][j]=0;
           }
           else
           {
               gp[i][j]=0x3f3f3f;
           }
       }
    }
    int a,b,c;
    for(i=0;i<m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        if(gp[a][b]>c)
        {
            gp[a][b]=c;
            gp[b][a]=c;
        }
    }
    dista();
    printf("%d\n",dist[n]);
    }


    return 0;
}
0 0
原创粉丝点击