Dijkstra板子题求调 50pts
查看原帖
Dijkstra板子题求调 50pts
972001
YING_Miranda楼主2024/7/30 10:42

玄二关

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e7 + 10;
const int inf = 1e9 + 10;
ll n, m, cnt, head[N], dis[N], s[N], c, start, ed, vis[N];
int h[8] = {0, 2, 6, 4, 8, 10, 14};
struct Edge{
	ll u, v, w, next;
}edge[N * 2];
void add(ll u, ll v, ll w){
	cnt++;
	edge[cnt].u = u;
	edge[cnt].v = v;
	edge[cnt].w = w;
	edge[cnt].next = head[u];
	head[u] = cnt;
}
struct node{
	ll v, w;
	bool operator<(const node &x)const{return w > x.w;}
};
priority_queue<node> q;
void dijkstra(int s){
	for(int i = 1; i <= 110; i++) dis[i] = inf;
	dis[s] = 0;
	q.push((node){s,0});
	while(!q.empty()){
		node k = q.top();
		q.pop();
		int u = k.v;
		if(vis[u] == 1) continue;
		vis[u] = 1;
		for(int i = head[u]; i; i = edge[i].next){
			int v = edge[i].v, w = edge[i].w;
			if(dis[u] + w < dis[v] && vis[v] != 1){
				dis[v] = dis[u] + w;
				q.push((node){v, dis[v]});
			}
		}
	}
}
int main(){
	for(int i = 1; i <= 7; i++){
		cin >> s[i];
	}
	cin >> start >> ed >> c;
	for(int i = 1; i <= c; i++){
		int u, v, w;
		cin >> u >> v >> w;
		int ww = h[w];
		if(s[w] == 1) ww /= 2;
		add(u, v, ww);
		add(v, u, ww);
	}
	dijkstra(start);
	cout << dis[ed];
	return 0;
}
2024/7/30 10:42
加载中...