1009

来源:互联网 发布:文件制作软件 编辑:程序博客网 时间:2024/06/14 02:37

题目编号:1009

题目大意:给定编号从1到N的路,求通过的最短时间。

解题思路:根据题意,每两个街道之间应该最多是一条路,否则时间会不同,那就没有意义了。典型的是最小生成树问题,用prim算法解题。首先,初始化,把所有的路全设为无穷大,然后再根据题目添加道路的权,也就是时间。后面,也就是解题的关键,找到从1到N的最短时间。我用一个函数来实现的。首先创建2个数组,1个表示从1开始到N的最短时间,另一个1起到标记的作用。在函数内,首先初始化2个数组,然后一个大的循环从1到N,里面首先找到标记的数组未到道路的编号,然后后面一个循环加里面比较,求最短的时间,这都是在大循环内做的。而后输出数组N的数值即可。

做题感想:题目看似很简单,感觉好难,套路的话也不是很简单的,可能是初学的缘故。唉,努力努力!!

#include<iostream>#include<cstring>using namespace std;const int N=10000;int ar[101],arr[101][101],br[101],n,m,i,j,t,p;void YJY(int x){       for(i=1;i<=n;++i)        ar[i]=N;    ar[x]=0;    memset(br,0,sizeof(br));    for(i=1;i<=n;++i)    {        p=-1;        for(j=1;j<=n;++j)          if(br[j]==0)            if(p==-1||ar[j]<ar[p])               p=j;        br[p]=1;        for(j=1;j<=n;++j)         if(br[j]==0)         {             t=ar[p]+arr[p][j];               if(t<ar[j])                 ar[j]=t;        }    }}int main(){    int a,b,c;    while(cin>>n>>m&&n&&m)    {        for(i=1;i<=n;++i)            for(j=1;j<=n;++j)                arr[i][j]=N;        for(i=1;i<=m;++i)        {            cin>>a>>b>>c;            arr[a][b]=arr[b][a]=c;        }        YJY(1);       cout<<ar[n]<<endl;    }    return 0;}


0 0
原创粉丝点击