列表

详情


NC238012. 阿宁去游玩

描述

阿宁打算下次放假去游玩。一共有 n 个城市, 阿宁住在 1 号城市,去到 n 号城市游玩。
城市有两种属性,一种是炎热,另一种是酷寒,每个城市是其中一种。从一个城市前往另一个城市,如果要前往的城市和当前城市的属性相同,则需要 x 时间,否则需要 y 时间。
阿宁可以使用倒转膜法,该膜法可以使所有城市(除了阿宁当前所在的城市)的属性变化(炎热变酷寒,酷寒变炎热),花费 z 时间。倒转膜法可以使用任意次。

阿宁想尽快去到 n 号城市游玩,她想知道她最少需要多少时间到达目的地?

输入描述

第一行输入两个正整数 n,m,表示一共有 n 个城市,m 条道路。
第二行输入三个正整数 x,y,z,表示不同动作花费的时间。
第三行输入 n 个正整数 a_i,表示第 i 城市的属性,0 表示炎热,1 表示酷寒。
接下来 m 行,每行输入两个正整数 u,v,表示 u 号城市和 v 号城市有道路相连。
(道路是双向的,即 u 能走到 vv 能走到 u
保证 1 号城市能到达 n 号城市。




输出描述

一个整数,表示阿宁从 1 号城市到达 n 号城市所需要的最少时间。

示例1

输入:

5 6
1 3 9
1 0 0 1 1
1 2
1 3
2 3
2 4
3 4
4 5

输出:

7

说明:

路径 1->3->4->5,花费时间为 3+3+1=7。

示例2

输入:

3 3
1 10 2
0 1 1
1 2
1 3
2 3

输出:

3

说明:

1 号城市使用一次倒转膜法,路径 1->3,花费时间为 2+1=3。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 687ms, 内存消耗: 13852K, 提交时间: 2022-08-26 22:05:45

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,m,x,y,z,a[N];
long long dis[N];
vector<int>e[N];
queue<int>q;
bool vis[N];
void SPFA(){
	memset(dis,0x3f,sizeof dis);
	dis[1]=0; q.push(1); vis[1]=1;
	while(!q.empty()){
		int u=q.front(); q.pop(); vis[u]=0;
		for(int i=0;i<e[u].size();++i){
			int v=e[u][i],w1,w2;
			if(a[u]==a[v]){
				w1=x;
				w2=z+y;
			} else {
				w1=y;
				w2=z+x;
			}
			if(dis[v]>dis[u]+w1 || dis[v]>dis[u]+w2){
				dis[v]=min(dis[v],dis[u]+min(w1,w2));
				if(!vis[v]){ q.push(v); vis[v]=1; }
			}
		}
	}
}
int main(){
	scanf("%d %d %d %d %d",&n,&m,&x,&y,&z);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
	for(int i=1;i<=m;++i){
		int u,v;
		scanf("%d %d",&u,&v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	SPFA();
	printf("%lld",dis[n]);
	return 0;
}

pypy3 解法, 执行用时: 1612ms, 内存消耗: 61060K, 提交时间: 2022-08-26 20:45:57

from queue import deque
import heapq
n, m = map(int, input().split())
x, y, z = map(int, input().split())
a = list(map(int, input().split()))
a = [0] + a
ed = [[] for _ in range(n + 1)]
for i in range(m):
    u, v = map(int, input().split())
    ed[u].append(v)
    ed[v].append(u)
q = [(0, 1)]
#vst = dict()
#vst[1] = 0
ans = [float("inf")] * (n + 1)
ans[1] = 0
while q:
    tp = heapq.heappop(q)
    #print(tp)
    for e in ed[tp[1]]:
        #if not x in vst:
        np = (tp[0] + (min(x, y + z) if a[e] == a[tp[1]] else min(y, x + z)), e)
        if np[0] < ans[e]:
            heapq.heappush(q, np) 
            ans[e] = np[0]
    #print(q)
print(ans[n])

上一题