洛谷 P1948 / loj 10074 / 一本通 1496【分层图】

6 篇文章 0 订阅
2 篇文章 0 订阅

坑点:求得是最大边权,dijk需要把求和改成最大值。

#include <bits/stdc++.h>
#define int long long

using namespace std;

vector<pair<int, int>> z[444444];
int dis[444444];
bool vis[444444];

struct Node
{
  int dis, u;
  bool operator<(const Node &a) const
  {
    return dis > a.dis;
  }
};

void dijkstra(int s)
{
  priority_queue<Node> pq;
  memset(dis, 0x3f, sizeof dis);
  dis[s] = 0;
  pq.push({0, s});
  while (pq.size())
  {
    int u = pq.top().u;
    pq.pop();
    if (!vis[u])
    {
      vis[u] = true;
      for (auto &ed : z[u])
      {
        int v = ed.first, w = ed.second;
        if (dis[v] > max(dis[u], w))
        {
          dis[v] = max(dis[u], w);
          pq.push({dis[v], v});
        }
      }
    }
  }
}

signed main()
{
  int n, m, k;
  cin >> n >> m >> k;
  int s, t;
  s = 1, t = n;
  while (m--)
  {
    int a, b, c;
    cin >> a >> b >> c;
    for (int i = 0; i <= k; i++)
      z[i * n + a].push_back({i * n + b, c}), z[i * n + b].push_back({i * n + a, c});
    for (int i = 0; i < k; i++)
      z[i * n + a].push_back({(i + 1) * n + b, 0}), z[i * n + b].push_back({(i + 1) * n + a, 0});
  }
  dijkstra(s);
  int mi = 0x3f3f3f3f3f3f3f3f;
  for (int i = 0; i <= k; i++)
    mi = min(mi, dis[i * n + t]);
  if (mi != 0x3f3f3f3f3f3f3f3f)
    cout << mi << '\n';
  else
    cout << "-1\n";
  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值