追星

题目描述

城市总共有N座。yintama是右京女神的狂热粉,当他得知右京女神将要在城市N举办演唱会的时候,马上开始准备动身前往城市N。原本他可以直接乘飞机直达城市N,然而贫穷使他屈服,他必须选择总花费最少的那条路径。设总共有N座城市(2<=N<=1000),城市编号分别为1,2,3......N。M条航线(1<=M<=2000),每条航线连接两座城市,相互可以到达(无向的)。yintama目前在身在城市1,求最后yintama参加右京女神演唱会所需要的最少花费。(PS:重边考虑一下?)

输入

有多组输入。

第一行输入一个N、M,代表城市的总数,以及航线的总数。

接下来M行,每行输入三个数字u v w,代表城市u、v之间存在航线,机票花费为w。

输出

每行输出一个数,代表yintama参加右京女神演唱会所需的最少花费。

样例输入

5 5 1 2 20 2 3 30 3 4 20 4 5 20 1 5 100

样例输出

90

提示

#include<iostream>
#include<cstring>
using namespace std;
#define maxx 0x3f3f3f3f
int m[1001][1001];
int process[1001][1001];
int tag[1001];
int N;
int M;
int get_min_index(int line)
{
    int vexnum=N;
    int index=0;
    for(int i=0;i<vexnum;i++)
    {
        if(tag[i]==0&&process[i][line]<process[index][line])
            index=i;
    }
    return index;
}
void Set_Min_Path_Djs(int n,int start)
{
    int vexnum=n;
    for(int i=0;i<vexnum;i++)
    {
        for(int j=0;j<vexnum;j++)
        {
            process[i][j]=maxx;
        }
    }
    memset(tag,0,sizeof(tag));
    tag[start]=1;
    for(int j=0;j<vexnum;j++)
    {
        if(tag[j]==0)
        {
            process[j][0]=m[start][j];
        }
    }
    int vmin=get_min_index(0);
    tag[vmin]=1;
    for(int i=1;i<vexnum;i++)
    {
        for(int j=0;j<vexnum;j++)
        {
            process[j][i]=process[j][i-1];
        }
        for(int j=0;j<vexnum;j++)
        {
            if(tag[j]==0&&m[start][vmin]+m[vmin][j]<m[start][j])
            {
                process[j][i]=m[start][vmin]+m[vmin][j];
                m[start][j]=m[start][vmin]+m[vmin][j];
            }
        }
        vmin=get_min_index(i);
        tag[vmin]=1;
    }
    /*for(int i=0;i<vexnum;i++)
    {
        for(int j=0;j<vexnum-1;j++)
        {
            if(process[i][j]==maxx)
                cout<<"∞ ";
            else
                cout<<process[i][j]<<" ";
        }
        cout<<endl;
    }*/
    cout<<process[vexnum-1][vexnum-2]<<endl;
}
int main()
{
    while(cin>>N>>M)
    {
        int x,y,num;
        memset(m,0,sizeof(m));
        for(int count=0;count<M;count++)
        {
            cin>>x>>y>>num;
            x--;
            y--;
 
            if(m[x][y]==0&&m[y][x]==0)
            {
                m[x][y]=num;
                m[y][x]=num;
            }
            else
            {
                int now=m[x][y];
                if(now>num)
                {
                    m[x][y]=num;
                    m[y][x]=num;
                }
            }
        }
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<N;j++)
            {
                if(m[i][j]==0)
                    m[i][j]=maxx;
            }
        }
        Set_Min_Path_Djs(N,0);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/SZU-DS-wys/p/12182930.html
今日推荐