TOJ 2732:存钱计划

Posted ww123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TOJ 2732:存钱计划相关的知识,希望对你有一定的参考价值。

描述

TZC的店铺比较多,上次WY随便走只要能走到就行,现在他学聪明了。WY去买东西的话,确定一家店以后,当然他先要想想怎么样走到那家店走的路最少。店与店之间是有走的方向的,从店A到店B可以,店B到店A未必可以。店与店之间是有一定距离的。

技术分享图片

上面就是路线,为方便起见,店铺都用数字表示,0表示WY的起点,店与店之间以及起点与店距离用d表示。WY从0开始到4店铺  那么最短路线为0-->3-->2-->4  总长为 60。

如果从0店铺开始到1店铺最短路线只有0-->1  总长 10。

当然也有可能没有路的情况。

输入

输入有多组测试数据。

每组数据的第一行为整数n(n<=10),表示店铺总数。所有店铺的编号为0~n-1。

接下来有若干行,每行为3个整数
a b t 
表示a编号的店铺走向b编号的店铺之间的一条路径,长度为t。0<=a,b<n(为有向路径,不能反向行走)。

当a b t的值为0 0 0 表示店铺之间的路径输入完毕,不做任何处理。

最后一行输入店铺的编号k(k<n)

输入n为0时表示结束程序。

输出

输出从店铺0到k店铺的最短路线的长度。如果没有路的话,输出 NO WAY!

题目大意:输出0-n的最短路径

解题思路:最短路

 解法一:floyd   可以求每两个点之间的最小距离

#include <iostream>
#include <algorithm>
using namespace std;
#define INF 1e8
int main()
{
    int map[11][11];
    int n,m,i,j,k;
    while(cin>>n&&n){
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                if(i==j) map[i][j]=0;
                else map[i][j]=INF;
            }
        }
        int a,b,c;
        while(cin>>a>>b>>c&&(a!=0||b!=0||c!=0))
        map[a][b]=c;
        for(k=0;k<n;k++){
            for(i=0;i<n;i++){
                for(j=0;j<n;j++){
                    map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
                }
            }
        }   //模板        cin>>m;
        if(map[0][m]!=INF)
        cout<<map[0][m]<<endl;
        else cout<<"NO WAY!"<<endl;
    }
    return 0;
}

 解法二

 Dijkstra   求单源最短路

#include <iostream>
#include <algorithm>
using namespace std;
#define INF 1e8
int main()
{
    int map[11][11];
    int d[11];
    int vis[11];
    int n,m,i,j,k,a,b,c,Min;
    while(cin>>n&&n){
            for(i=0;i<n;i++){
                for(j=0;j<n;j++){
                    if(i==j)
                        map[i][j]=0;
                    else map[i][j]=INF;
                }
            }
                while(cin>>a>>b>>c&&(a||b||c)) map[a][b]=c;
                for(i=0;i<n;i++){
                    d[i]=map[0][i];
                    vis[i]=1;
                }
                for(i=0;i<n;i++){
                    Min=INF;
                    k=i;
                    for(j=0;j<n;j++){
                        if(Min>d[j]&&vis[j]==1){
                            Min=d[j];
                            k=j;
                        }
                    }
                    vis[k]=0;
                    for(j=0;j<n;j++){
                       d[j]=min(d[j],d[k]+map[k][j]);
                    }
                }
            cin>>m;
            if(d[m]==INF)
                cout<<"NO WAY!"<<endl;
            else
            cout<<d[m]<<endl;
            }
    }

 

 



以上是关于TOJ 2732:存钱计划的主要内容,如果未能解决你的问题,请参考以下文章

TZOJ :2731: 存钱计划

线程同步代码块:两个客户往一个银行存钱,每人存三十次一次存一百。 模拟银行存钱功能,时时银行现金数。

网络流强化-HDU2732

HDU 2732 Leapin&#39; Lizards(拆点+最大流)

HDU 2732 Leapin&#39; Lizards(拆点+最大流)

HDU1114&BUCU5971——存钱罐——题解