最短路问题

来源:互联网 发布:微商城分销php开发手册 编辑:程序博客网 时间:2024/06/01 19:32

2478: 最短路问题

Time Limit:5000MS Memory Limit:65536KB
Total Submit:16 Accepted:3 Page View:402
Submit Status Discuss
现在有n个城市,编号从1到n。现在已知从城市i到城市j需要走的时间为aij。M78要从城市1到城市n。M78有一个飞行符,飞行符可以使得他瞬间通过一条边或连续的两条边(连续走一条边或两条边的时间为0)。问,M78从城市1到城市n,最少花费的时间。
多组输入。每组第一行有一个整数n,表示城市的数目。(2<=n<=1000)接下来将输入一个n*n的矩阵。矩阵第i行第j列的数字aij表示从城市i到城市j,花费的时间为aij。(0<=aij<=10000 , aii=0 ,aij=aji)。如果aij=0,表示没有这条路。
每组输出一个数字,表示M78从城市1到城市n花费的最少时间。特别的,如果M78到不到了城市n,输出-1。
30 1 11 0 11 1 0
0
Submit Status Discuss

题中把图的构造直接告诉我们了,所以只需要用数组存起来直接用Floyd算法,就可以求得最短路径,不过之前我写错的地方是没注意到应该双向赋值。

#include <iostream>#include<cstring>#include<cstdio>#define INF 9999999using namespace std;int main(){    int n,m,a,b,w[105][105],len;    while(scanf("%d%d",&n,&m)!=EOF)    {        if(n==0||m==0)            break;        else        {            for(int i=1;i<=n;i++)                for(int j=1;j<=n;j++)                    w[i][j]=(i==j?0:INF);            for(int i=1;i<=m;i++)            {                scanf("%d%d%d",&a,&b,&len);                if(a != b && w[a][b] > len)                    {                        w[a][b]=len;                        w[b][a]=len;                                   //双向赋值                    }            }            for(int k=1;k<=n;k++)                            //Floyd模板            for(int i=1;i<=n;i++)                for(int j=1;j<=n;j++)            {                if(w[i][j]>w[i][k]+w[k][j])                    w[i][j]=w[i][k]+w[k][j];            }            printf("%d\n",w[1][n]);        }    }    return 0;}


0 1
原创粉丝点击