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 0 1 4 4 1 2 1 1 3 1 2 4 2 3 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;
}