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

kruskal
1.之前图中未破坏的边必用,全部加到图中
2.途中被破坏的边按照边权从小到大的顺序依次加入图中,直到图变为连通图

两个方法的对应一个点的最小生成树的复杂度都是nlogm,第二个方法较好写

优化:
1.未破坏的边直接加入图中
2.当有n-2条边(当前删去一个点后,图中n-1个点)在图中时,直接结束建生成树

另外:
求图的连通性:
有向 强连通
无向 并查集

当然,并查集好写很多。。。
**/

 #include <stdio.h>
#include <stdlib.h>
#define maxn 500
#define maxm 125000
#define maxdist 100000 /**
题目:删去一个点,然后求出需要增加最小代价的边集合生成连通图
思路:
prim+最小堆
1.之前图中未破坏的边必用,从而把两两之间可互达的点集合 合并成一个点
2.求出不同点集合的最短距离,用prim+最小堆求出最小生成树 kruskal
1.之前图中未破坏的边必用,全部加到图中
2.途中被破坏的边按照边权从小到大的顺序依次加入图中,直到图变为连通图 两个方法的对应一个点的最小生成树的复杂度都是nlogm,第二个方法较好写 优化:
1.未破坏的边直接加入图中
2.当有n-2条边(当前删去一个点后,图中n-1个点)在图中时,直接结束建生成树 另外:
求图的连通性:
有向 强连通
无向 并查集 当然,并查集好写很多。。。
**/ struct node
{
long x,y,c,s;
}edge0[maxm+],edge1[maxm+];
long fa[maxn+]; long max(long a,long b)
{
if (a>b)
return a;
else
return b;
} int cmp(const void *a,const void *b)
{
//先把未损坏的路径加入图中
if ((*(struct node *)a).s < (*(struct node *)b).s)
return ;
else if ((*(struct node *)a).s > (*(struct node *)b).s)
return -;
//再对已损坏的路径进行排序,用kruskal算法,m log m
else if ((*(struct node *)a).c < (*(struct node *)b).c)
return ;
else
return -;
} long getfather(long d)
{
if (fa[d]==d)
return d;
else
return getfather(fa[d]);
} int main()
{
long i,j,n,m,p,q,x,y,c,s,g,fx,fy,ans,cost[maxn+];
while (scanf("%ld%ld",&n,&m)!=EOF)
{
p=;
q=;
for (i=;i<m;i++)
{
scanf("%ld%ld%ld%ld",&x,&y,&c,&s);
if (s==)
{
p++;
edge1[p].x=x; edge1[p].y=y; edge1[p].c=c; edge1[p].s=s;
}
else
{
q++;
edge0[q].x=x; edge0[q].y=y; edge0[q].c=c; edge0[q].s=s;
}
}
qsort(edge0+,q,sizeof(struct node),cmp); ans=;
for (i=;i<=n;i++)
{
for (j=;j<=n;j++)
fa[j]=j;
g=;
//edge - exist
for (j=;j<=p;j++)
{
if (edge1[j].x==i || edge1[j].y==i) continue;
fx=getfather(edge1[j].x);
fy=getfather(edge1[j].y);
if (fx==fy) continue;
fa[fx]=fy;
g++;
if (g==n-)
break;
}
//优化
if (g==n-)
{
cost[i]=;
continue;
} //edge - not exist
cost[i]=;
for (j=;j<=q;j++)
{
if (edge0[j].x==i || edge0[j].y==i) continue;
fx=getfather(edge0[j].x);
fy=getfather(edge0[j].y);
if (fx==fy) continue;
fa[fx]=fy;
g++;
cost[i]+=edge0[j].c;
//优化
if (g==n-)
break;
}
if (g<n-)
cost[i]=maxdist;
ans=max(ans,cost[i]);
}
if (ans>)
{
for (i=;i<=n;i++)
if (cost[i]==ans)
{
printf("%ld",i);
break;
}
for (j=i+;j<=n;j++)
if (cost[j]==ans)
printf(" %ld",j);
printf("\n");
}
else
printf("0\n");
}
return ;
}

pat1001. Battle Over Cities - Hard Version 解题报告的更多相关文章

  1. PAT-Top1001. Battle Over Cities - Hard Version (35)

    在敌人占领之前由城市和公路构成的图是连通图.在敌人占领某个城市之后所有通往这个城市的公路就会被破坏,接下来可能需要修复一些其他被毁坏的公路使得剩下的城市能够互通.修复的代价越大,意味着这个城市越重要. ...

  2. 【LeetCode】278. First Bad Version 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 二分查找 日期 题目地址:https://leetcode.c ...

  3. Lintcode: First Bad Version 解题报告

    First Bad Version http://lintcode.com/en/problem/first-bad-version The code base version is an integ ...

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

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

  5. codeforces B. Ping-Pong (Easy Version) 解题报告

    题目链接:http://codeforces.com/problemset/problem/320/B 题目意思:有两种操作:"1 x y"  (x < y) 和 " ...

  6. PAT 解题报告 1013. Battle Over Cities (25)

    1013. Battle Over Cities (25) t is vitally important to have all the cities connected by highways in ...

  7. 【LeetCode】165. Compare Version Numbers 解题报告(Python)

    [LeetCode]165. Compare Version Numbers 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...

  8. Facebook Hacker Cup 2014 Qualification Round 竞赛试题 Square Detector 解题报告

    Facebook Hacker Cup 2014 Qualification Round比赛Square Detector题的解题报告.单击这里打开题目链接(国内访问需要那个,你懂的). 原题如下: ...

  9. LeetCode: Search in Rotated Sorted Array II 解题报告

    Search in Rotated Sorted Array II Follow up for "LeetCode: Search in Rotated Sorted Array 解题报告& ...

随机推荐

  1. [2016北京集训试题15]cot-[分块]

    Description Solution 如图,假如我们知道了以任何一个点为顶点的135-180度的前缀和和90-180度的前缀和,我们就可以搞出三角形的面积. 差分.add[i][j]和dev[i] ...

  2. ajax传递数组给controller的实现方法和坑

    这里是前端向后端传递一个数组的方式,参考下面这个示例: (主要是将前端的数组,用 JSON.stringify() 方法json化一下,然后后端springmvc接收到以后,使用 JSONArray  ...

  3. bodymovin实现将AE动画转换成HTML5动画

    做一个简单的记录,直接贴代码吧,主要还是设计师提供的那个json <!DOCTYPE html> <html> <head> <style> body ...

  4. fatal error: caffe/proto/caffe.pb.h: No such file or directory

    solution: $make clean $make all -j8

  5. 初级字典树查找在 Emoji、关键字检索上的运用 Part-2

    系列索引 Unicode 与 Emoji 字典树 TrieTree 与性能测试 生产实践 在有了 Unicode 和 Emoji 的知识准备后,本文进入编码环节. 我们知道 Emoji 是 Unico ...

  6. jquery原理的简单分析,让你扒开jquery的小外套。

    引言 最近LZ还在消化系统原理的第三章,因此这部分内容LZ打算再沉淀一下再写.本次LZ和各位来讨论一点前端的内容,其实有关jquery,在很久之前,LZ就写过一篇简单的源码分析.只不过当时刚开始写博客 ...

  7. jenkins pipeline 部署

    一.git 版本控制结合jenkins 发布 sh-4.2$ git branch sh-4.2$ git chekout master sh-4.2$ git tag v1.1 sh-4.2$ gi ...

  8. Nginx浅析

    Nginx浅析 Nginx是什么 总的来说,Nginx其实就是一个和apache类似的服务器软件. Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件代理服务器,并在一个BSD-like ...

  9. 小白之selenium+python关于cookies绕开登录2

    首先,由于新开始在博客园中写随笔,可能在内容的布局方面就不太懂,导致布局很丑,各位见谅,但是字还是原来的那字,内容还是原来的内容,少了点包装, 下面是对cookie的扩展知识 1.配置文件存储在哪里? ...

  10. 记录Appium-desktop踩过的坑could not find devices

    最近了解到一个自动化入门的新工具appium-desktop,看网上各种文章,感觉这个工具是很简单的一个入门级工具,下载试用了一下. 官网下载,输入网址appium.io,点击下载. 一路傻瓜式安装, ...