abc243 E - Edge Deletion

题意:

给定无重边无自环的带正权无向连通图,问最多删除几条边能保持所有点对的最短距离不变

n300

思路:

删除边 uwv 当且仅当原图中存在其它路径的长度小于等于 w,即存在中间点 k,使得 d(u,k)+d(k,v)w

因为每次都在原图中找其他路径,所以(相比在删除若干边后的新图上找)找到的可能性是最大的。这样会不会删太多了?答案是不会,只需证明这样得到的子图符合题意:

考虑原图中 uv 的最短路径中边数最多的那条,记为 path。若 path 仅有一条边则 uv 的距离没变,符合题意;若 path 不止一条边则把 path 拆成两部分,由归纳法可以证明符合题意

可以用 floyd 实现

const int N = 310;
int n, m, ans;
bool g[N][N]; //还有没有此边
ll d[N][N];
void sol() {
    memset(d, 0x3f, sizeof d);
    cin >> n >> m;
    while(m--) {
        int x, y, z; cin >> x >> y >> z;
        d[x][y] = d[y][x] = z;
        g[x][y] = true;
    }
    for(int k = 1; k <= n; k++)
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                if(d[i][j] >= d[i][k] + d[k][j])
                    d[i][j] = d[i][k] + d[k][j],
                    ans += g[i][j], g[i][j] = 0;
    cout << ans;
}
posted @   Bellala  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2022-01-15 cf1204 D2. Kirk and a Binary String (hard version)(思维)
2022-01-15 cf360 B. Levko and Array(二分答案,dp判断)
2022-01-15 cf1060 E. Sergey and Subway(树形dp)
点击右上角即可分享
微信分享提示