求优化,如果数据变强怎么办?
查看原帖
求优化,如果数据变强怎么办?
857626
_RainCappuccino_楼主2023/7/7 11:49
#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
using namespace std;

#define int long long

#define For(i,j,k) for(int i=j;i<=k;i++)
#define Res(i,j,k) for(int i=j;i>=k;i--)
#define endl '\n'
#define IOS ios::sync_with_stdio(0)
#define pb(i) push_back(i)
#define pf(i) push_front(i)
#define mem(a,b) memset(a,b,sizeof a)
const int M = 1000000 + 5;
int n, m;
int x[M], y[M], W[M];
int cnt, hd[M];
struct Edge {
	int to, nxt, w;
} e[M * 2];
int nt, root, tmp, top, idx;
int dfn[M], low[M], vis[M], bel[M];
int cut[M], st[M], siz[M];

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

void tarjan (int u) {
	dfn[u] = low[u] = ++tmp;
	st[++top] = u;
	for (int i = hd[u]; i; i = e[i].nxt) {
		int v = e[i].to;
		if (!dfn[v]) {
			tarjan (v);
			low[u] = min (low[u], low[v]);
		} else if (!bel[v]) low[u] = min (low[u], dfn[v]);
	}
	if (dfn[u] == low[u]) {
		siz[++idx] = 1;
		bel[u] = idx;
		while (st[top] != u) {
			bel[st[top]] = idx;
			siz[idx]++;
			top--;
		}
		top--;
	}
}
struct node {
	int dis, u;
	bool operator>(const node& a)const {
		return dis > a.dis;
	}
};
int dis[M];
priority_queue<node, vector<node>, greater<node> >q;
void Dijkstra(int s) {
	memset(dis, 0x3f3f3f3f, sizeof dis);
	dis[s] = 0;
	q.push({0, s});
	while (!q.empty()) {
		int u = q.top().u;
		q.pop();
		if (vis[u]) continue;
		vis[u] = 1;
		for(int i = hd[u];i;i = e[i].nxt){
			int v = e[i].to,w = e[i].w;
			if (dis[v] > dis[u] + w) {
				dis[v] = dis[u] + w;
				q.push({dis[v], v});
			}
		}
	}
}

signed main () {
	ios::sync_with_stdio(0);
	cin.tie();
	cout.tie();
	cin >> n >> m;
	For(i, 1, m) {
		int u, v, w;
		cin >> u >> v >> w;
		x[i] = u, y[i] = v, W[i] = w;
		add(u, v, w);
	}
	For(i, 1, n) {
		if (!dfn[i]) {
			tarjan(i);
		}
	}
	cnt  = 0;
	mem(hd, 0);
	mem(e, 0);
	For(i,1,m) {
		if (bel[x[i]] != bel[y[i]]) {
			add (bel[x[i]], bel[y[i]], W[i]);
		}
	}
	Dijkstra(bel[1]);
	cout << dis[bel[n]];
	return 0;
}

我在学校OJ上交,TLE了两个点

2023/7/7 11:49
加载中...