zoukankan      html  css  js  c++  java
  • USACO / Bessie Come Home( Dijkstra标程 )

    Bessie Come Home

    回家




    现在是晚餐时间,而母牛们在外面分散的牧场中。 农民约翰按响了电铃,所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛)。 在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。 每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)。 有时,两个牧场(可能是字母相同的)之间会有超过一条道路相连。 至少有一个牧场和谷仓之间有道路连接。 因此,所有的母牛最后都能到达谷仓,并且母牛总是走最短的路径。 当然,母牛能向着任意一方向前进,并且她们以相同的速度前进。 牧场被标记为'a'..'z'和'A'..'Y',在用大写字母表示的牧场中有一只母牛,小写字母中则没有。 谷仓的标记是'Z',注意没有母牛在谷仓中。[编辑]
    描述


    注意'm'和'M'不是同一个牧场 否则错误 上面的意思是说:输入数据中可能会同时存在M,m(郁闷ing),比如

    M a a m m z

    格式

    PROGRAM NAME: comehome

    INPUT FORMAT

    第 1 行: 整数 P(1<= P<=10000),表示连接牧场(谷仓)的道路的数目。

    第 2 ..P+1行: 用空格分开的两个字母和一个整数:

    被道路连接牧场的标记和道路的长度(1<=长度<=1000)。

    SAMPLE INPUT

    (file comehome.in)

    5
    A d 6
    B d 3
    C e 9
    d Z 8
    e Z 3
    

    OUTPUT FORMAT

    单独的一行包含二个项目: 最先到达谷仓的母牛所在的牧场的标记,和这只母牛走过的路径的长度。

    SAMPLE OUTPUT

    (file comehome.out)

    B 11
    
    
    这道题本来没什么好说的,就是裸Dijkstra,但是鉴于自己以前竟然把Dijkstra写错了!而且要不是USACO给数据我都不知道我错了。。。所以在这儿还是把标程贴出来吧。。。
    /*
    ID:138_3531
    LANG:C++
    TASK:comehome
    */
    
    
    #include <iostream>
    #include <iomanip>
    #include <fstream>
    #include <cmath>
    #include <cstring>
    
    
    #define MAX 100000
    
    
    using namespace std;
    
    
    int p;
    int d[130][130];
    int dist[130];
    int vis[130];
    
    
    ifstream fin("comehome.in");
    ofstream fout("comehome.out");
    
    
    void input()
    {
        fin>>p;
    
    
        for (int i='A';i<='z';i++)
            for (int j='A';j<='z';j++)
                d[i][j]=MAX;
        for (int i='A';i<='z';i++)
            dist[i]=MAX;
    
    
    
    
        for (int i=0;i<p;i++)
        {
            char a,b;
            fin>>a>>b;
            int temp;
            fin>>temp;
            if (temp<d[a][b])   {d[a][b]=temp; d[b][a]=temp;}
        }
    }
    
    
    void dijkstra()
    {
        dist['Z']=0;
        int ok=1;
        while(ok)
        {
            ok=0;
            int min=MAX;
            int k;
            for (int i='A';i<='z';i++)
                if ((!vis[i])&&(dist[i]<min))
                {
                    min=dist[i];
                    k=i;
                    ok=1;
                }
            vis[k]=1;
            for (int i='A';i<='z';i++)
                if (!vis[i])
                {
                    if (dist[i]>dist[k]+d[i][k])
                    {
                        dist[i]=dist[k]+d[i][k];
                    }
                }
    
    
        }
    }
    
    
    int main()
    {
        input();
        dijkstra();
        int min=MAX;
        char k;
        for (int i='A';i<'Z';i++)
        {
            if (i!='Z')
                if (dist[i]<min)
                {
                    min=dist[i];
                    k=i;
                }
        }
    
    
        fout<<k<<' '<<min<<endl;
        return 0;
    }
    
  • 相关阅读:
    攻防世界web新手区前六关
    JS-数组基础知识3
    CSRF攻击的原理和spring security对CSRF攻击的解决方法
    Java开发微信公众号
    内部类
    Java Web整合开发(30) -- Spring的ORM模块
    win10安装mysql
    jquery 事件冒泡的介绍以及如何阻止事件冒泡
    jquery中attr和prop的区别介绍
    jQuery 层次选择器
  • 原文地址:https://www.cnblogs.com/AbandonZHANG/p/2598278.html
Copyright © 2011-2022 走看看