/**
题目:删去一个点,然后求出需要增加最小代价的边集合生成连通图
思路:
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. WPF编程,通过KeyFrame 类型制作控件线性动画的一种方法。

    原文:WPF编程,通过KeyFrame 类型制作控件线性动画的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/articl ...

  2. UWP-开发一个具有闹钟,天气预报,翻译,语音功能的Demo

    UWP即Windows 10中的Universal Windows Platform简称.即Windows通用应用平台,在Windows 10 Mobile/Surface(Windows平板电脑)/ ...

  3. POJ1035&&POJ3080&&POJ1936

    字符串处理专题,很早就写好了然而忘记写blog了 1035 题意:给你一些单词作为字典.然后让你查找一些单词.对于每个单词,如果在字典中就输出它.否则输出所有它通过删除||增加||替换一个字符能得到的 ...

  4. PHP学习 类型 变量 常数 运算符

    PHP支持下列8种类型 标量类型 scalar type整数 integer浮点数 float double布尔 boolean字符串 string 特殊类型 special typeNULL资源 r ...

  5. C++中清空缓冲区

    C++中标准输入cin有多种输入方式.. 这篇文章罗列的还是简要易懂的.C++输入cin详解...如果只是简单的使用cin>>的话,会单个token的读入.但是会忽略换行符,空格,制表符等 ...

  6. OVS流表table之间的跳转

    OVS流表table之间的跳转 前言 今天在帮学弟解决问题的时候,遇到一个table0.table1之间的微妙小插曲,引起了注意,后来查了一下资料发现原因了. 问题描述 wpq@wpq:~$ sudo ...

  7. Alpha冲刺——day8

    Alpha冲刺--day8 作业链接 Alpha冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602634 ...

  8. PAT 甲级 1085 Perfect Sequence

    https://pintia.cn/problem-sets/994805342720868352/problems/994805381845336064 Given a sequence of po ...

  9. [Delphi]实现使用TIdHttp控件向https地址Post请求[转]

    开篇:公司之前一直使用http协议进行交互(比如登录等功能),但是经常被爆安全性不高,所以准备改用https协议.百度了一下资料,其实使用IdHttp控件实现https交互的帖子并不少,鉴于这次成功实 ...

  10. NetScaler 10.1的配置以及结合StoreFront的部署

    工作需要,所以英文+中文,绝壁不是装逼...(关于这点勿喷) This post will cover only the basics for getting NetScaler up and run ...