求调最短路,悬关
查看原帖
求调最短路,悬关
381926
_Anonymous_楼主2023/7/11 13:48

subtask#1WA,subtask#0AC

SPFA,用了个链表,不知道哪里错了,求调

#include<bits/stdc++.h>
#define MAXN 100010
#define MAXM 500010
using namespace std;

int n, m, t, b, E;

struct mov{
	long long t, x;
}a[MAXN];
bool cmp(mov a, mov b)
{
	return a.t < b.t;
}

struct edge{
	int to, nxt, w;
}e[MAXM << 1];
int head[MAXN], tot;

void init()
{
	memset(head, -1, sizeof(head));
	tot = 0;
}

void add(int u, int v, int w)
{
	e[tot].to = v, e[tot].w = w, e[tot].nxt = head[u];
	head[u] = tot++;
}


long long dis[MAXN];
int l[MAXN], hd, tl;
void SPFA()
{
	memset(dis, 63, sizeof(dis));
	dis[b] = 0;
	l[b] = -1, hd = tl = b;
	while(hd != -1)
	{
		int u = hd;
		hd = l[u];
		l[u] = 0;
		if(head[u] == -1)
		{
			continue;
		}
		for(edge i = e[head[u]];; i = e[i.nxt])
		{
			if(dis[u] + i.w < dis[i.to])
			{
				dis[i.to] = dis[u] + i.w;
				if(!l[i.to])
				{
					l[tl] = i.to;
					tl = i.to;
					l[i.to] = -1;
					if(hd == -1)
					{
						hd = i.to;
					}
				}
			}
			if(i.nxt == -1)
			{
				break;
			}
		}
	}
}

int main() 
{
	init();
	cin >> n >> m >> b >> E;
	a[1].t = 0, a[1].x = E;
	for(int i = 1; i <= m; i++)
	{
		int u, v, w;
		scanf("%d %d %d", &u, &v, &w);
		add(u, v, w);
		add(v, u, w);
	}
	cin >> t;
	t++;
	for(int i = 2; i <= t; i++)
	{
		scanf("%lld %lld", &a[i].t, &a[i].x);	
	}
	sort(a + 1, a + t + 1, cmp);
	SPFA();
	for(int i = 1; i <= t - 1; i++)
	{
		if(dis[a[i].x] < a[i + 1].t)
		{
			printf("%lld\n", max(dis[a[i].x], a[i].t));
			return 0;
		}
	}
	cout << dis[a[t].x] << endl;
}
2023/7/11 13:48
加载中...