为什么用链式前向星就会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;
}