代码求调!!!
  • 板块灌水区
  • 楼主Tomwsc
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/11/8 19:56
  • 上次更新2024/11/8 21:45:11
查看原帖
代码求调!!!
1418967
Tomwsc楼主2024/11/8 19:56

@2023gdgz01

P3393

代码如下:

#include<bits/stdc++.h>
#define inf 91145141919810
#define int long long
using namespace std;
const int MAXN = 1e6 + 10 , MAXM = MAXN << 1;
int n , m , k , s;
int p , pp;
int z[MAXN];
int he[MAXN] , to[MAXM] , ne[MAXM];
int idx;
int dis[MAXN];
bool flag[MAXN] , vis[MAXN] , safe[MAXN];

inline int read() {
	char c = getchar();
	int x = 0 , s = 1;
	while(c < '0' || c > '9') {
		if(c == '-')	
			s = -1;
		c = getchar();
	}
	while(c >= '0' && c <= '9') {
		x = x * 10 + c - '0';
		c = getchar();
	}
	return x * s;
}

inline void add(int a , int b) {
	to[++ idx] = b;
	ne[idx] = he[a];
	he[a] = idx;
	return;
}

inline void bfs(int u , int s) {
	queue<pair<int , int> >q;
	q.push(make_pair(u , 0));
	while(!q.empty()) {
		int u = q.front().first;
		int t = q.front().second;
		q.pop();
		if(t == s)
			continue;
		for(int i = he[u];i;i = ne[i]) {
			if(!safe[to[i]]) {
				safe[to[i]] = true;
				q.push(make_pair(to[i] , t + 1));
			}
		}
	}
	return;
}

inline void dijkstra() {
	memset(vis , false , sizeof(vis));
	for(int i = 1;i <= n;i ++)
		dis[i]= inf;
	priority_queue<pair<int , int> , vector<pair<int , int> > , greater<pair<int , int> > >q;
	dis[1] = 0;
	q.push(make_pair(0 , 1));
	while(!q.empty()) {
		int u = q.top().second;
		q.pop();
		if(vis[u])
			continue;
		vis[u] = true;
		for(int i = he[u];i;i = ne[i]) {
			int x = to[i];
			if(flag[x])
				continue;
			if(safe[x]) {
				if(dis[u] + pp < dis[x]) {
					dis[x] = dis[u] + pp;
					q.push(make_pair(dis[x] , x));
				}
			}
			else {
				if(dis[u] + p < dis[x]) {
					dis[x] = dis[u] + p;
					q.push(make_pair(dis[x] , x));
				}
			}
		}
	}
	return;
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	n = read();
	m = read();
	k = read();
	s = read();
	p = read();
	pp = read();
	for(int i = 1;i <= k;i ++) {
		z[i] = read();
		flag[z[i]] = true;
	}
	for(int i = 1;i <= m;i ++) {
		int a , b;
		a = read();
		b = read();
		add(a , b);
		add(b , a); 
	}
	for(int i = 1;i <= k;i ++)
		bfs(z[i] , s);
//	for(int i = 1;i <= n;i ++)
//		cout << safe[i] << " ";
//	cout << '\n';
	dijkstra();
	if(safe[n])
		dis[n] -= pp;
	else
		dis[n] -= p;
	cout << dis[n];
	return 0;
}
2024/11/8 19:56
加载中...