zoukankan      html  css  js  c++  java
  • 杭电(hdu)1181 变形课

    变形课

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)
    Total Submission(s): 18343    Accepted Submission(s): 6597


    Problem Description
    呃......变形课上Harry碰到了一点小麻烦,由于他并不像Hermione那样可以记住全部的咒语而任意的将一个棒球变成刺猬什么的,可是他发现了变形咒语的一个统一规律:假设咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体. 
    Harry已经将他所会的全部咒语都列成了一个表,他想让你帮忙计算一下他能否完毕老师的作业,将一个B(ball)变成一个M(Mouse),你知道,假设他自己不能完毕的话,他就仅仅好向Hermione请教,而且被迫听一大堆好好学习的道理.
     

    Input
    測试数据有多组。每组有多行,每行一个单词,仅包含小写字母,是Harry所会的全部咒语.数字0表示一组输入结束.
     

    Output
    假设Harry能够完毕他的作业,就输出"Yes.",否则就输出"No."(不要忽略了句号)
     

    Sample Input
    so soon river goes them got moon begin big 0
     

    Sample Output
    Yes.
    Hint
    Hint
    Harry 能够念这个咒语:"big-got-them".
     
    先来介绍下floyd算法:

    让我们来看一个样例,看下图:

    图中红色的数字代表边的权重。

    假设我们在最内层检查全部节点X。那么对于A->B,我们仅仅能发现一条路径,就是A->B,路径距离为9。而这显然是不对的,真实的最短路径是A->D->C->B,路径距离为6。造成错误的原因就是我们把检查全部节点X放在最内层,造成过早的把A到B的最短路径确定下来了,当确定A->B的最短路径时Dis(AC)尚未被计算。所以,我们须要改写循环顺序,例如以下:

    for ( int k = 0; k < 节点个数; ++k )
    {
        for ( int i = 0; i < 节点个数; ++i )
        {
            for ( int j = 0; j < 节点个数; ++j )
            {
                if ( Dis[i][k] + Dis[k][j] < Dis[i][j] )
                {
                    // 找到更短路径
                    Dis[i][j] = Dis[i][k] + Dis[k][j];
                }
            }
        }
    }

    这样一来,对于每个节点X。我们都会把全部的i到j处理完成后才继续检查下一个节点。

    代码例如以下:
    #include<iostream>  
    #include<cstring>  
    #include<string>
    #include<cstdio>  
    using namespace std;  
    int weight[30][30];  
    void floyd()
    {
        for(int t=0;t<26;t++)
            for(int i=0;i<26;i++)
                for(int j=0;j<26;j++)
                    if(weight[i][t]&&weight[t][j])
                        weight[i][j]=1;
    }  
    int main()
    {  
        char s[100];  
        while(gets(s))
        {  
            memset(weight,0,sizeof(weight));  
            while(s[0]!='0')
            {
                weight[s[0]-'a'][s[strlen(s)-1]-'a']=1;
                gets(s);
            }
            floyd();
            if(weight[1][12])
                printf ("Yes.
    ");  
            else
                printf ("No.
    ");  
        }  
    }  

  • 相关阅读:
    做汉堡
    作业2结对子
    软件开发流程阅读《构建之法》 第5.5 第6 第7章
    自动生成四则运算
    修改过的四则运算
    【暴力DP】[Dota1004]受折磨的灵魂(TormentedSoul)
    【Blog】Start My Journey In Cnblogs!
    【DP+ShortPath】[Dota1000]德鲁伊(Dyrad)
    【Watery DP】[Dota1002]光之守卫(Gandolf)
    【DP】[Dota1003]育母蜘蛛(BroodMother)
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7169887.html
Copyright © 2011-2022 走看看