|
|
@ -12,7 +12,7 @@ struct Edge {
|
|
|
|
bool operator<(const Edge &t) const {
|
|
|
|
bool operator<(const Edge &t) const {
|
|
|
|
return c < t.c;
|
|
|
|
return c < t.c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} edge[M]; // 因为本题需要用链式前向星建图,所以避开了使用e做为边的数组名称
|
|
|
|
} edge[M];
|
|
|
|
|
|
|
|
|
|
|
|
int d1[N][N]; // 从i出发,到达j最短距离
|
|
|
|
int d1[N][N]; // 从i出发,到达j最短距离
|
|
|
|
int d2[N][N]; // 从i出发,到达j次短距离
|
|
|
|
int d2[N][N]; // 从i出发,到达j次短距离
|
|
|
@ -24,7 +24,6 @@ void add(int a, int b, int c) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 并查集
|
|
|
|
// 并查集
|
|
|
|
int p[N];
|
|
|
|
int p[N];
|
|
|
|
|
|
|
|
|
|
|
|
int find(int x) {
|
|
|
|
int find(int x) {
|
|
|
|
if (x == p[x]) return x;
|
|
|
|
if (x == p[x]) return x;
|
|
|
|
return p[x] = find(p[x]);
|
|
|
|
return p[x] = find(p[x]);
|
|
|
@ -74,7 +73,6 @@ signed main() {
|
|
|
|
// Kruskal求最小生成树
|
|
|
|
// Kruskal求最小生成树
|
|
|
|
for (int i = 0; i < m; i++) {
|
|
|
|
for (int i = 0; i < m; i++) {
|
|
|
|
int a = edge[i].a, b = edge[i].b, c = edge[i].c;
|
|
|
|
int a = edge[i].a, b = edge[i].b, c = edge[i].c;
|
|
|
|
|
|
|
|
|
|
|
|
int pa = find(a), pb = find(b);
|
|
|
|
int pa = find(a), pb = find(b);
|
|
|
|
if (pa != pb) {
|
|
|
|
if (pa != pb) {
|
|
|
|
p[pa] = pb; // 并查集合并
|
|
|
|
p[pa] = pb; // 并查集合并
|
|
|
@ -96,7 +94,7 @@ signed main() {
|
|
|
|
for (int i = 0; i < m; i++)
|
|
|
|
for (int i = 0; i < m; i++)
|
|
|
|
if (!edge[i].flag) {
|
|
|
|
if (!edge[i].flag) {
|
|
|
|
int a = edge[i].a, b = edge[i].b, c = edge[i].c;
|
|
|
|
int a = edge[i].a, b = edge[i].b, c = edge[i].c;
|
|
|
|
if (c > d1[a][b]) // 最小生成树外的一条边,(a-b),如果比最小生成树中a-b的最长边长,就有机会参加评选次小生成树。
|
|
|
|
if (c > d1[a][b]) // 最小生成树外的一条边,(a->b),如果比最小生成树中a->b的最长边长,就有机会参加评选次小生成树。
|
|
|
|
// 最终的选举结果取决于它增加的长度是不是最少的
|
|
|
|
// 最终的选举结果取决于它增加的长度是不是最少的
|
|
|
|
res = min(res, sum + c - d1[a][b]); // 替换最大边
|
|
|
|
res = min(res, sum + c - d1[a][b]); // 替换最大边
|
|
|
|
else if (c > d2[a][b]) // 替换严格次大边
|
|
|
|
else if (c > d2[a][b]) // 替换严格次大边
|
|
|
|