在敌人占领之前由城市和公路构成的图是连通图。在敌人占领某个城市之后所有通往这个城市的公路就会被破坏,接下来可能需要修复一些其他被毁坏的公路使得剩下的城市能够互通。修复的代价越大,意味着这个城市越重要。如果剩下的城市无法互通,则说明代价无限大,这个城市至关重要。最后输出的是代价最大的城市序号有序列表。借助并查集和Kruskal算法(最小生成树算法)来解决这个问题。

 //#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <vector> using namespace std; struct edge { // edge struct
int u, v, cost;
};
vector<edge> edges; // the number of edges is greater than 500 far and away int cmp(edge a, edge b) { // sort rule
return a.cost < b.cost;
} int parent[]; // union-find set void initParent(int n) { // initialize union-find set
int i;
for(i = ; i <= n; i++) {
parent[i] = -; // a minus means it is a root node and its absolute value represents the number of the set
}
} int findRoot(int x) { // find the root of the set
int s = x;
while(parent[s] > ) {
s = parent[s];
} int temp;
while(s != x) { // compress paths for fast lookup
temp = parent[x];
parent[x] = s;
x = temp;
} return s;
} void unionSet(int r1, int r2) { // union sets. More concretely, merge a small number of set into a large collection
int sum = parent[r1] + parent[r2];
if(parent[r1] > parent[r2]) {
parent[r1] = r2;
parent[r2] = sum;
} else {
parent[r2] = r1;
parent[r1] = sum;
}
} int maxw = ; // max cost
bool infw; // infinite cost int kruskal(int n, int m, int out) { // Kruskal algorithm to get minimum spanning tree
initParent(n); int u, v, r1, r2, num = , i, w = ;
for (i = ; i < m; i++) {
u = edges[i].u;
v = edges[i].v; if (u == out || v == out) {
continue;
} r1 = findRoot(u);
r2 = findRoot(v); if (r1 != r2) {
unionSet(r1, r2);
num++; if (edges[i].cost > ) { // only consider the cost which is not zero
w += edges[i].cost;
} if (num == n - ) {
break;
}
}
} //printf("num %d\n", num);
if (num < n - ) { // spanning tree is not connected
w = -; // distinguish the situation of the occurrence of infinite cost if (!infw) { // when infinite cost first comes out
infw = true;
}
} return w;
} int main() {
int n, m;
scanf("%d%d", &n, &m); int i, status;
edge e;
for (i = ; i < m; i++) {
scanf("%d%d%d%d", &e.u, &e.v, &e.cost, &status);
if (status == ) {
e.cost = ;
} edges.push_back(e);
} if (m > ) {
sort(edges.begin(), edges.end(), cmp);
} int curw, res[], index = ;
for (i = ; i <= n; i++) { // traverse all vertices to obtain the target vertex
curw = kruskal(n, m, i);
if (!infw) { // when infinite cost doesn't come out
if (curw < maxw) {
continue;
} if (curw > maxw) {
index = ;
maxw = curw;
}
res[index++] = i;
} else { // otherwise
if (curw < ) {
if (maxw > ) {
maxw = -;
index = ;
} res[index++] = i;
}
}
} if (index > ) {
for (i = ; i < index; i++) {
if (i > ) {
printf(" ");
}
printf("%d", res[i]);
}
} else {
printf("");
}
printf("\n"); system("pause");
return ;
}

  

  参考资料

pat-top 1001. Battle Over Cities - Hard Version (35)

PAT-Top1001. Battle Over Cities - Hard Version (35)的更多相关文章

  1. PAT 1013 Battle Over Cities

    1013 Battle Over Cities (25 分)   It is vitally important to have all the cities connected by highway ...

  2. PAT 1013 Battle Over Cities(并查集)

    1013. Battle Over Cities (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It ...

  3. pat 1013 Battle Over Cities(25 分) (并查集)

    1013 Battle Over Cities(25 分) It is vitally important to have all the cities connected by highways i ...

  4. PAT 1013 Battle Over Cities (dfs求连通分量)

    It is vitally important to have all the cities connected by highways in a war. If a city is occupied ...

  5. PAT A1013 Battle Over Cities (25 分)——图遍历,联通块个数

    It is vitally important to have all the cities connected by highways in a war. If a city is occupied ...

  6. PAT 1013 Battle Over Cities DFS深搜

    It is vitally important to have all the cities connected by highways in a war. If a city is occupied ...

  7. pat1001. Battle Over Cities - Hard Version 解题报告

    /**题目:删去一个点,然后求出需要增加最小代价的边集合生成连通图思路:prim+最小堆1.之前图中未破坏的边必用,从而把两两之间可互达的点集合 合并成一个点2.求出不同点集合的最短距离,用prim+ ...

  8. 「日常训练」Battle Over Cities - Hard Version(PAT-TOP-1001)

    题意与分析 题意真的很简单,实在不想讲了,简单说下做法吧. 枚举删除每个点,然后求最小生成树,如果这个路已经存在那么边权就是0,否则按照原来的处理,之后求花费,然后判整个图是否联通(并查集有几个roo ...

  9. PAT_A1013#Battle Over Cities

    Source: PAT A1013 Battle Over Cities (25 分) Description: It is vitally important to have all the cit ...

随机推荐

  1. Echo()、print()、print_r()区别

    echo可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用.echo是php的内部指令,不是函数, ...

  2. C#动态系统托盘图标

    C#动态系统托盘图标 利用timer组件定时执行变化. using System; using System.Windows.Forms; namespace DynamicStockIcon { p ...

  3. Android Studio 修改包名最便捷做法

    Android Studio,咱们开发安卓的利器,自推出就受到移动开发者的追捧,但一路走来,大家谈到他,充满了兴奋之情之余,也略显羞涩.随版本自推出以来,不断完善BUG,但咱们还是深深地踩了进去,说多 ...

  4. Echarts-各个配置项详细说明总结【转】

    1.图表标题 1 title: { 2 x: 'left', // 水平安放位置,默认为左对齐,可选为: 3 // 'center' ¦ 'left' ¦ 'right' 4 // ¦ {number ...

  5. .net core支持的操作系统版本

    https://github.com/dotnet/core/blob/master/os-lifecycle-policy.md

  6. c_数据结构_链表

    #include<stdio.h> #include<stdlib.h> #define ERROR 0 #define OK 1 #define OVERFLOW -2 ty ...

  7. Python_xml

    xml: 可扩展标记语言,用来标记数据,定义数据类型,主要用来传输和存储数据(和json差不多,不同语言或程序之间进行数据交换的协议) ET(xml.etree.ElementTree)中的几个类: ...

  8. Kudu的集群安装(1.6.0-cdh5.14.0)

    kudu的架构体系 下图显示了一个具有三个 master 和多个 tablet server 的 Kudu 集群,每个服务器都支持多个 tablet.它说明了如何使用 Raft 共识来允许 maste ...

  9. net core体系-web应用程序-1VS2017构建一个简单的web

    使用vs2017,添加一个新项目-asp.net core web应用程序. 结构如图, wwwroot放了网站的静态资源如css.js.image文件: appsetting.json是应用程序的配 ...

  10. centos7下docker启动失败解决

    docker启动失败解决 could not change group /var/run/docker.sock to docker: gr... not found 如果出现:Job for doc ...