1009 Problem I


题意:在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

思路:最短路径问题,利用dijkstra算法,寻找到从1到N的最短路径。

感想:数组的初始化,以及对于下一个值的判断都十分重要,找不到循环判断条件,问题会很麻烦。

#include<iostream>

#include<stdio.h>

#include<string.h>

using namespace std;

int n,m;

int map[110][110],v[110],d[110];

void dij(int p){

    int i,j,k,t=n;

    for(i=1;i<=n;i++)

        d[i]=10000000;

    memset(v,0,sizeof(v));

    d[p]=0;

    for(j=1;j<=n;j++){

        k=-1;

        for(i=1;i<=n;i++)

            if(v[i]!=1){

               if(k==-1||d[i]<d[k]){

                k=i;

            }

        }

        v[k]=1;

       for(i=1;i<=n;i++){

            if(v[i]!=1){

                inttmp=d[k]+map[k][i];

               if(tmp<d[i])

                   d[i]=tmp;

            }

        }

    }

}

int main(){

    int a,b,c,i,j;

   while(cin>>n>>m){

       if(n==m&&m==0)

            break;

       for(i=1;i<=n;++i){

           map[i][i]=10000000;

           for(j=i+1;j<=n;++j)

               map[i][j]=map[j][i]=10000000;

        }

        for(i=0;i<m;i++){

           scanf("%d%d%d",&a,&b,&c);

           map[a][b]=map[b][a]=c;

        }

        dij(1);

       printf("%d\n",d[n]);

    }

    return 0;

}

你可能感兴趣的:(1009 Problem I)