站外题求助
  • 板块学术版
  • 楼主Krimson
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/2/18 11:19
  • 上次更新2023/11/5 03:07:34
查看原帖
站外题求助
206998
Krimson楼主2021/2/18 11:19

原题名字Currency Exchange Centers
简述题意:
下标从0开始的n个点以及m条边,每条边有一个权值ww和一个种类cc,请求出其最小生成树.
如果有多权值相同的最小生成树,则输出使用边的种类最少的方案.即w\sum w为第一关键字,不同的种类数CC为第二关键字.
保证有解.
n,m[1,1e5]n,m\in[1,1e5]

能搜到的题解都是根据边的权值为第一关键字,该种类的边是否出现为第二关键字,使用priority_queuel来实现.
其中一篇题解的代码

unordered_set<string> se;//se中存储已经出现过的种类
struct edge
{
    int x, y;
    string s;
    int val;
    edge(int a = 0, int b = 0, string c = "", int d = 0) : x(a), y(b), s(c), val(d){}
    bool operator < (const edge b) const 
    {
        return val != b.val ? val > b.val : se.find(s) == se.end();
    }
}e[maxn << 1];

但是这样似乎不能保证一定是最优解

hack数据

3 3
0 1 B 1
0 1 A 1
1 2 B 3

这种做法无法判断这种情况.实际上,因为当前的选择会影响到后面的优先级,贪心的正确性似乎无法保证了.

请问是否存在正确的做法?又或者说是这道题是个假题?

2021/2/18 11:19
加载中...