求大佬帮忙
查看原帖
求大佬帮忙
1036693
carp_oier楼主2023/9/7 18:33

求大佬帮忙把代码中一些可以把 long long 替换成 int 的部分,降一下时间复杂度和常数。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rl register ll

const ll N = 3e3 + 10, M = 2e4 + 10, INF = 1e9;

struct node
{
	ll id, dis;
	bool operator <(const node &x) const
	{
		return dis > x.dis;
	}
};

ll n, m;

ll tot, ne[M], e[M], h[N], w[M], dis[N], sla[N], cnt;

ll dist[N];

bool st[N];

priority_queue<node> qdij;

queue<ll> q;

inline void dij(ll s)
{
	memset(st, 0, sizeof st);
	
	for(rl i=1;i <= n; ++ i) dist[i] = INF;
	
	dist[s] = 0;
	qdij.push({s, dis[s]});
	
	while(qdij.size())
	{
		node asd = qdij.top();
		qdij.pop();
		ll u = asd.id;
		if(st[u]) continue;
		st[u] = 1;
		for(rl i=h[u]; ~i; i = ne[i])
		{
			ll v = e[i];
			if(dist[v] > dist[u] + w[i])
			{
				dist[v] = dist[u] + w[i];
				qdij.push({v, dist[v]});
			}
		}
	}
}

inline bool spfa()
{
	memset(st, 0, sizeof st);
	memset(dis, 0x3f, sizeof dis);
	
	dis[0] = 0;
	q.push(0);
	
	while(q.size())
	{
		ll u = q.front();
		q.pop();
		st[u] = false;
		for(rl i=h[u]; ~i; i = ne[i])
		{
			ll v = e[i];
			if(dis[v] > dis[u] + w[i])
			{
				dis[v] = dis[u] + w[i];
				if(!st[v]) 
				{
					st[v] = 1, q.push(v);
					if(++ sla[v] > n) return false;
				}
			}
		}
	}
	
	return true;
}

inline void add(ll a, ll b, ll c)
{
	ne[++tot] = h[a], h[a] = tot, e[tot] = b, w[tot] = c;
}

int main()
{
	cin >> n >> m;
	
	memset(h, -1, sizeof h);
	
	for(rl i=1;i <= m; ++ i)
	{
		ll a, b, c;
		cin >> a >> b >> c;
		add(a, b, c);
	}
	
	for(rl i=1;i <= n; ++ i)
		add(0, i, 0);
		
	bool flag = spfa();
	
	if(!flag)
	{
		cout << "-1" << endl;
		return 0;
	}
	
	for(rl i=1; i <= n; ++ i)
		for(rl j=h[i]; ~j; j = ne[j])
			w[j] += dis[i] - dis[e[j]];
	
	for(rl i=1; i<= n; ++ i)
	{
		dij(i);
		ll ans = 0;
		for(rl j=1; j <= n; ++ j)
		{
			if(dist[j] == INF) ans += j * INF;
			else ans += j * (dist[j] + dis[j] - dis[i]);
		}
		
		cout << ans << endl;
	}
	return 0;
}
2023/9/7 18:33
加载中...