fjnu 1441 哈利.波特与魔法石

来源:互联网 发布:会计软件开发 编辑:程序博客网 时间:2024/04/29 20:17

Description

大年初三的那个晚上,小可可去电影院看了《哈利?波特与魔法石》,回到家坐在椅子上不一会儿就睡着了,并且梦见自己成了哈利?波特驰骋在充满了正义与邪恶的宇宙中执著地为了正义而战.

那天哈利?波特去拯救Super Samuel星球上的生灵.该星球上有七种不同的地形,依次分别是石子路,森林,草地,山地,雪地,沼泽和沙漠,用数字1~7来表示.任意两个城市之间都存在至少一条通路,而且任意两个能够不经过别的城市而直接通达的城市i和j之间都只存在一种地形ti,j.奇怪的是,在Super Samuel星球上哈利?波特穿越地形u所需要的时间与该地形的区域大小无关,却与地形的区域中是否有魔法石有关.如果地形u的区域中没有魔法石,哈利?波特要花费hu的时间才能穿越该区域,否则他只要花一半的时间就能穿越了.已知h1=2,h2=6,h3=4,h4=8,h5=6,h6=10和h7=14.su=1表示地形的区域中有魔法石;su=0表示地形u的区域中没有魔法石.

例如,如图所示,有4对可以直接通达的城市(城市1与2,1与3,2与4以及3与4);s1=0,s2=1,s3=s4=s5=s6=s7=0即只有森林中有魔法石,因此穿越森林所花费的时间是6/2=3,穿越石子路和草地的时间仍然分别是2和4.如果哈利?波特想从城市1到达城市4,则最快的路线是经过城市2,这条路线需要的时间是2+3=5.


哈利?波特总是忙于铲除邪恶,伸张正义,没有时间去寻找从起点城市i到终点城市j之间的最快路线.现在聘你作为哈利?波特的助手编写程序寻找最快路线为哈利?波特腾出更多的时间来将正义事业进行到底.

Input

第一行有七个数,分别是s1,s2,…,s7;第二行有两个数,依次分别是起点城市i和终点城市j;第三行有一个正整数c,c<=10000,表示随后的c行中每行存放了一对能直接通达的城市的信息.能直接通达的城市的信息由三个数组成,依次分别是两个城市的编号和这两个城市之间的地形.城市的编号都是不超过100的正整
数,但是各个城市的编号未必连续.

Output

输出起点城市i与终点城市j之间的最快路线所需要的时间.

Sample Input

0 1 0 0 0 0 01 441 2 11 3 12 4 23 4 3

Sample Output

5
KEY:这题是求两点之间最短路径的问题,开始是一直RE原来,是我对没初始化的变量使用了,后来是wa,后来翻翻书发现的的算法有问题,三重循环位置不对,改了AC
Source:

#include
<iostream>
#define MAX 1000000
using namespace std;

int s[10];
int h[10]={0,2,6,4,8,6,10,14};
int x,y;
int n;
int a[101][101];


void init()
{
    
int i,j;
    
for(i=1;i<=100;i++)
    
{        
        
for(j=1;j<=100;j++)
            a[i][j]
=MAX;
    }

    
for(i=1;i<=100;i++)
        a[i][i]
=0;
}


void input()
{
    
int i,c;
    
for(i=1;i<=7;i++)
        cin
>>s[i];
    cin
>>x>>y;
    
if(x>n) n=x;
    
if(y>n) n=y;
    cin
>>c;
    
int xt,yt,st;
    
for(i=1;i<=c;i++)
    
{
        cin
>>xt>>yt>>st;
        
if(xt>n) n=xt;
        
if(yt>n) n=yt;
        
if(s[st]==1
        
{
            a[xt][yt]
=a[yt][xt]=h[st]/2;
        }

        
else
        
{
            a[xt][yt]
=a[yt][xt]=h[st];
        }

    }

}


void shorest()
{
    
int i,j,k;
    
for(k=1;k<=n;k++)
        
for(i=1;i<=n;i++)
            
for(j=1;j<=n;j++)
                
if(a[i][k]+a[k][j]<a[i][j])
                    a[i][j]
=a[i][k]+a[k][j];
}


int main()
{
//    freopen("fjnu_1441.in","r",stdin);
    init();
    input();
    shorest();
    cout
<<a[x][y]<<endl;
    
return 0;
}






 
原创粉丝点击