- 网红重庆1
【问题描述】
网红城市——重庆,堪称一座8D的魔幻大都市,明明(不要问我明明是谁?)在一楼上的电梯,到了11楼出电梯又是一楼。
假设重庆有N个地点,给出各个地点的海拔高度,各个地点之间可能有双向的路径连接,或者单向的路径连接。有一个外地人来重庆,要从地点C到D,但他对爬坡下坎很不习惯,请帮他在从C到D所有路径中,找一条海拔变化(海拔降低或升高都视为正的值)最小的路径,即组成路径的各条直接路径海拔变化的总和最小。
【输入形式】
输入文件包含多个测试数据。每个测试数据第1行是两个整数N和M,N表示地点的数目,5≤N≤50,地点的序号从1开始计起,M表示这N个地点之间直接路径的数目,对任意两个地点A、B,A和B之间有一条双向直接路径、从A到B有一条单向直接路径、从B到A有一条单向直接路径,这3种情形最多只出现一种情形,测试数据保证这N个地点之间是互相可达的(再啷个爬坡下坎,总还是走得到的);第2行有N个整数,表示这N个地点的海拔高度,范围在[100, 1000],可能存在相同海拔高度的地点;接下来有M行,描述了M条直接路径,格式为“1 A B”或“2 A B”,前者表示从地点A到地点B的一条单向直接路径,后者表示地点A和B之间的一条双向直接路径,A和B为地点的序号,A≠B;每个测试数据的最后一行为两个整数C和D,表示那个外地人要从地点C到D,C和D为地点的序号,C≠D。测试数据保证地点序号都是有效的。
输入文件最后一行为0 0,代表输入结束。
【输出形式】
对每个测试数据,输出占一行,为求得的从地点C到D的各条路径中海拔变化总和的最小值。
【样例输入】
5 5
100 160 230 450 120
2 1 2
1 1 5
2 2 5
2 3 4
2 4 5
1 3
0 0
【样例输出】
570
#include<bits/stdc++.h>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 100
struct node
{
int t;
int w;
node*next;
};
queue<int>q;
int n,N;
node*List[MAXN];
int inq[MAXN];
int d[MAXN];
int p[MAXN];
int a[MAXN];//海拔高度
void spfa(int src)
{
int i,u;//u为队列头顶点序号
node*t;
for(i=1;i<=N;i++)
<