洛谷P2294. [HNOI2005] 狡猾的商人
题意简述
解题思路
等于号变成两个不等号
可以得到下式
false
,否则输出true
代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110, M = 2020;
int h[N], a[N], n, m, idx;
int dist[N], st[N], ring;
struct Edge
{
int cur, ne, w;
} e[M];
void add(int a, int b, int c)
{
e[ ++ idx].cur = b, e[idx].ne = h[a];
e[idx].w = c, h[a] = idx;
}
void dfs(int u)
{
st[u] = 1;
for (int i = h[u]; i; i = e[i].ne)
{
int j = e[i].cur;
if (dist[j] > dist[u] + e[i].w)
{
dist[j] = dist[u] + e[i].w;
if (st[j] == 1)
{
ring = true ;
break ;
}
dfs(j);
if (ring) return ;
}
}
st[u] = 2;
}
int main()
{
int T;
scanf("%d", &T);
while (T -- )
{
scanf("%d%d", &n, &m);
memset(h, 0, sizeof h);
memset(st, 0, sizeof st);
idx = ring = 0;
while (m -- )
{
int s, t, v;
scanf("%d%d%d", &s, &t, &v);
add(s - 1, t, v), add(t, s - 1, -v);
}
for (int i = 1; i <= n; i ++ )
{
if (ring) break ;
if (st[i]) continue ;
dfs(i);
}
puts(ring ? "false" : "true");
}
}
--------------------------分割线-----------------------
并查集代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 220;
int d[N], p[N], n, m, T, ok;
int find(int x)
{
if (x == p[x]) return x;
int root = find(p[x]);
d[x] += d[p[x]];
return p[x] = root;
}
void add(int u, int v, int w)
{
int fu = find(u), fv = find(v);
if (fu != fv)
{
p[fv] = fu;
d[fv] = d[u] - d[v] + w;
}
else if (d[v] - d[u] != w) ok = 0;
}
int main()
{
scanf("%d", &T);
while (T -- )
{
scanf("%d%d", &n, &m);
for (int i = 0; i <= n; i ++ ) d[i] = 0, p[i] = i;
ok = 1;
while (m -- )
{
int s, t, v;
scanf("%d%d%d", &s, &t, &v);
add(s - 1, t, v);
}
puts(ok ? "true" : "false");
}
return 0;
}
区间DP
容易得到以下状态表示
然后false
代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 220, INF = 0x3f3f3f3f;
int f[N][N], n, m, T, ok;
int main()
{
scanf("%d", &T);
while (T -- )
{
scanf("%d%d", &n, &m);
ok = 1;
memset(f, 0x3f, sizeof f);
while (m -- )
{
int s, t, v;
scanf("%d%d%d", &s, &t, &v);
if (f[s][t] == INF) f[s][t] = v;
else if (f[s][t] != v) ok = 0;
}
if (!ok)
{
puts("false");
continue ;
}
for (int len = 1; len <= n && ok; len ++ )
{
for (int l = 1, r = l + len - 1; r <= n; l ++, r ++ )
{
for (int k = l; k < r; k ++ )
{
if (f[l][k] != INF && f[k + 1][r] != INF)
{
if (f[l][r] == INF) f[l][r] = f[l][k] + f[k + 1][r];
else if (f[l][r] != f[l][k] + f[k +1][r]) ok = 0;
}
}
}
}
puts(ok ? "true" : "false");
}
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业