P1186 玛丽卡
既然标签是暴力,那就别加后面三个点啊!毕竟标签没有线段树。
传送门:P1186
不就是暴力吗?先跑一遍 Dijkstra,记录最短路的每一条边。然后删除每一条边再跑一次最短路并更新答案。但是这样会超时,最后三个点过不去。但是,不要忘了,我们有时在比赛时不会写 dp 的题目可以暴力 dfs,虽然会超时,但是如果我们记录下来总共 dfs 了多少次,在中途快超时停下来,可能也会 AC,反正避免了 TLE。借助这个性质,我们可以在删除边时记录总共进行了多少次,过大时停下。再借助神奇的 register、O2、scanf,就可以切掉这个蓝题了!
代码:
#include <cstdio>
#include <vector>
#include <queue>
#include <ctime>
#include <cstdlib>
#include <cstring>
using namespace std;
#define int long long
const int N = 1e4 + 5;
int n, m, ans = 0;
struct Edge
{
int place, cost;
Edge(int x, int y)
{
place = x;
cost = y;
}
};
struct Node
{
int pos, dist;
Node(int q, int w) { pos = q, dist = w; }
bool operator<(const Node& e) const
{
return e.dist < dist;
}
};
vector<Edge> vec[N];
int dis[N];
vector<int> pre(N);
bool vis[N];
bool cant[N][N];
void dijkstra()
{
priority_queue<Node> q;
q.push(Node(1, 0));
pre[1] = 0;
dis[1] = 0;
while (!q.empty())
{
Node l = q.top();
register int places = l.pos;
q.pop();
vis[l.pos] = true;
for (register int i = 0; i < vec[places].size(); i++)
{
register int news = vec[places][i].place;
if (dis[news] > dis[places] + vec[places][i].cost)
{
dis[news] = dis[places] + vec[places][i].cost;
pre[news] = places;
if (!vis[news]) q.push(Node(news, dis[places] + vec[places][i].cost));
}
}
}
}
void dijkstra2()
{
priority_queue<Node> q;
q.push(Node(1, 0));
dis[1] = 0;
while (!q.empty())
{
Node l = q.top();
register int places = l.pos;
q.pop();
vis[l.pos] = true;
for (register int i = 0; i < vec[places].size(); i++)
{
if (cant[places][vec[places][i].place]) continue;
register int news = vec[places][i].place;
if (dis[news] > dis[places] + vec[places][i].cost)
{
dis[news] = dis[places] + vec[places][i].cost;
if (!vis[news]) q.push(Node(news, dis[places] + vec[places][i].cost));
}
}
}
}
signed main()
{
int pl = 0;
scanf("%lld %lld", &n, &m);
for (register int i = 1; i <= m; i++)
{
int u, v, w;
scanf("%lld %lld %lld", &u, &v, &w);
vec[u].push_back(Edge(v, w));
vec[v].push_back(Edge(u, w));
}
memset(dis, 0x3f, sizeof(dis));
dijkstra();
register int now = n, l = 250;
while (pre[now])
{
pl++;
memset(dis, 0x3f, sizeof(dis));
memset(vis, 0, sizeof(vis));
cant[pre[now]][now] = true;
dijkstra2();
ans = max(ans, dis[n]);
cant[pre[now]][now] = false;
now = pre[now];
if (pl >= l) break;
}
printf("%lld\n", ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现