TLE飞了,快崩溃了
查看原帖
TLE飞了,快崩溃了
409860
yu1102楼主2023/7/17 22:25

真的不知道错在哪了。跟LRJ的做法一模一样,理论上是不会超时的呀。

请dalao指点,悬赏关注。

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

const int MAXN = 2e5 + 10, MAXM = 2e5 + 10, INF = 0x3f3f3f3f;

struct Edge
{
	int from, to, nxt, c;
	Edge(int u, int v, int _nxt, int _c):from(u), to(v), nxt(_nxt), c(_c){}
	Edge(){}
} e[MAXM * 2];
int edge_cnt, hd[MAXN];
void add(int u, int v, int c)
{
	e[++edge_cnt] = Edge(u, v, hd[u], c);
	hd[u] = edge_cnt;
}

int n, m;
int d[MAXN];

void bfs()
{
	static int q[MAXN], front, rear;
	
	front = rear = 1;
	q[rear++] = n;
	
	memset(d, 0x3f, sizeof(d));
	d[n] = 0;
	
	while (front < rear)
	{
		int u = q[front++];
		for (int i = hd[u]; i; i = e[i].nxt)
		{
			int v = e[i].to;
			if (d[v] == INF)
			{
				d[v] = d[u] + 1;
				q[rear++] = v;
			}
		}
	}
}

void output()
{
	cout << d[1] << endl;
	
	static int vx[MAXN], sizx, vy[MAXN], sizy;
	static int ans[MAXN];
	
	vx[sizx = 1] = 1;
	for (int i = 1; i <= d[1]; i++)
	{
		int minc = INF;
		for (int j = 1; j <= sizx; j++)
		{
			int u = vx[j];
			for (int k = hd[u]; k; k = e[k].nxt) if (d[u] == d[e[k].to] + 1)
				minc = min(minc, e[k].c);			
		}
		
		ans[i] = minc;
		
		sizy = 0;
		for (int j = 1; j <= sizx; j++)
		{
			int u = vx[j];
			for (int k = hd[u]; k; k = e[k].nxt) if (d[u] == d[e[k].to] + 1)
				if (e[k].c == minc)
					vy[++sizy] = e[k].to;			
		}
		
		sizx = sizy;
		for (int j = 1; j <= sizx; j++)
			vx[j] = vy[j];
	}
	
	cout << ans[1];
	for (int i = 2; i <= d[1]; i++)
		cout << ' ' << ans[i];
	
	cout << endl;
}

int main()
{
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	while (cin >> n >> m)
	{
		edge_cnt = 0;
		memset(hd, 0, sizeof(hd));
		int u, v, c;
		for (int i = 1; i <= m; i++)
		{
			cin >> u >> v >> c;
			if (u == v) continue;
			add(u, v, c);
			add(v, u, c);
		}
		
		bfs();
		output();
	}
}
2023/7/17 22:25
加载中...