码迷,mamicode.com
首页 > 其他好文 > 详细

[CF449B] Jzzhu and Cities - 最短路

时间:2020-12-11 11:52:49      阅读:4      评论:0      收藏:0      [点我收藏+]

标签:make   def   for   cin   eof   i++   lin   mat   最短路   

Description

\(n\) 个点 \(m\) 条边的无向图,另有 \(k\) 条特殊边连接 \(1-i\),问最多删除多少条特殊边,使得每个点到 \(1\) 的最短距离不变。

Solution

考虑先计算到每个点的最短路条数,然后判断。

如果 \(1 \to i\) 有特殊边,若特殊边长度 \(>\) 距离,那么显然这条特殊边没有贡献,直接删除。若等于距离,并且最短路条数 \(>1\),则删除这条特殊边,并将最短路条数 \(-1\)

注意这里 \(-1\) 以后我们并不需要去考虑它对其它的点的影响。

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1000005;
int n, m, k, d[N], h[N], spec[N][3], cnt[N], vis[N];

vector<pair<int, int>> g[N];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> que;

void make(int u, int v, int w)
{
    g[u].push_back({v, w});
    g[v].push_back({u, w});
}

signed main()
{
    cin >> n >> m >> k;
    int t1, t2, t3;
    for (int i = 1; i <= m; i++)
    {
        cin >> t1 >> t2 >> t3;
        make(t1, t2, t3);
    }

    for(int i=1;i<=k;i++)
    {
        cin>>t1>>t2;
        make(1,t1,t2);
        spec[i][1]=t1;
        spec[i][2]=t2;
    }

    memset(d, 0x3f, sizeof d);
    d[1] = 0;
    que.push({0, 1});

    while (que.size())
    {
        int p = que.top().second;
        que.pop();
        if (vis[p] == 0)
        {
            vis[p] = 1;
            for (auto pr : g[p])
            {
                int q = pr.first, w = pr.second;
                if (d[q] == d[p] + w)
                    ++cnt[q];
                if (d[q] > d[p] + w)
                {
                    cnt[q] = 1;
                    d[q] = d[p] + w;
                    que.push({d[q], q});
                }
            }
        }
    }

    int ans = 0;
    for (int i = 1; i <= k; i++)
    {
        if (d[spec[i][1]] < spec[i][2])
            ++ans;
        else if (d[spec[i][1]] == spec[i][2] && cnt[spec[i][1]] > 1)
            ++ans, --cnt[spec[i][1]];
    }

    cout << ans << endl;
}

[CF449B] Jzzhu and Cities - 最短路

标签:make   def   for   cin   eof   i++   lin   mat   最短路   

原文地址:https://www.cnblogs.com/mollnn/p/14095591.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!