AC了,但有个小小的疑惑(悬1关)
查看原帖
AC了,但有个小小的疑惑(悬1关)
685260
ZettaByte楼主2024/8/5 12:56

为什么用链式前向星就会T掉,换成邻接表就A了?

链式前向星TLE 55pts:记录

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll N = 10010, INF = (ll)1e18;
ll n, m, E, head[N], vis[N], dis[N];
struct edge { ll to, nxt, w; }e[N<<1];
void add(ll u, ll v, ll w) { e[++E] = {v, head[u], w}, head[u] = E; }
bool spfa(ll u)
{
	vis[u] = 1;
	for (ll i = head[u]; i; i = e[i].nxt)
	{
		ll v = e[i].to;
		if (dis[v] < dis[u] + e[i].w)
		{
			dis[v] = dis[u] + e[i].w;
			if (vis[v] || !spfa(v)) return false;
		}
	} return vis[u] = 0, true;
}

int main()
{
	scanf("%lld%lld", &n, &m);
	for (ll i = 1, op, u, v, c; i <= m; i++)
	{
		scanf("%lld%lld%lld", &op, &u, &v);
		if (op == 1) scanf("%lld", &c), add(v, u, c);
		else if (op == 2) scanf("%lld", &c), add(u, v, -c);
		else add(u, v, 0), add(v, u, 0);
	}
	for (ll i = 1; i <= n; i++) add(0, i, 0), dis[i] = -INF;
	if (!spfa(0)) puts("No");
	else puts("Yes");
	return 0;
}

邻接表 AC 100pts:记录

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll N = 10010, INF = (ll)1e18;
ll n, m, E, head[N], vis[N], dis[N]; vector<pair<ll, ll> > g[N];
bool spfa(ll u)
{
	vis[u] = 1;
	for (auto x : g[u])
	{
		ll v = x.first, w = x.second;
		if (dis[v] < dis[u] + w)
		{
			dis[v] = dis[u] + w;
			if (vis[v] || !spfa(v)) return false;
		}
	} return vis[u] = 0, true;
}

int main()
{
	scanf("%lld%lld", &n, &m);
	for (ll i = 1, op, u, v, c; i <= m; i++)
	{
		scanf("%lld%lld%lld", &op, &u, &v);
		if (op == 1) scanf("%lld", &c), g[v].push_back({u, c});
		else if (op == 2) scanf("%lld", &c), g[u].push_back({v, -c});
		else g[u].push_back({v, 0}), g[v].push_back({u, 0});
	}
	for (ll i = 1; i <= n; i++) g[0].push_back({i, 0}), dis[i] = -INF;
	if (!spfa(0)) puts("No");
	else puts("Yes");
	return 0;
}
2024/8/5 12:56
加载中...