题意与分析

题意真的很简单,实在不想讲了,简单说下做法吧。

枚举删除每个点,然后求最小生成树,如果这个路已经存在那么边权就是0,否则按照原来的处理,之后求花费,然后判整个图是否联通(并查集有几个root),如果不联通直接硬点花费是INF,然后处理输出答案即可。

一道最小生成树的模板题,比较有学习的意义。

代码

/*
* Filename: pat_top_1001.cpp
* Date: 2018-11-05
*/ #include <bits/stdc++.h> #define INF 0x3f3f3f3f
#define PB emplace_back
#define MP make_pair
#define fi first
#define se second
#define rep(i,a,b) for(repType i=(a); i<=(b); ++i)
#define per(i,a,b) for(repType i=(a); i>=(b); --i)
#define ZERO(x) memset(x, 0, sizeof(x))
#define MS(x,y) memset(x, y, sizeof(x))
#define ALL(x) (x).begin(), (x).end() #define QUICKIO \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define DEBUG(...) fprintf(stderr, __VA_ARGS__), fflush(stderr) using namespace std;
using pi=pair<int,int>;
using repType=int;
using ll=long long;
using ld=long double;
using ull=unsigned long long; const int MAXN=505,MAXM=125005;
int n,m;
struct Edge
{
int u,v,w;
bool ok;
Edge(int _u, int _v, int _w, bool _o):
u(_u), v(_v), w(_w), ok(_o) {}
};
vector<Edge> edges;
vector<int> G[MAXN];
void add_edge(int u, int v, int w, bool ok)
{
edges.PB(u,v,w,ok);
G[u].PB(int(edges.size())-1);
} int edges_ord[MAXM];
int pa[MAXN];
int find_pa(int x)
{
return pa[x]==x?x:pa[x]=find_pa(pa[x]);
}
bool union_pa(int x,int y)
{
int fx=find_pa(x),
fy=find_pa(y);
if(fx!=fy) pa[fx]=fy;
else return false;
return true;
}
int kruskal(int nope_pnt)
{
int ans=0;
iota(pa+1, pa+n+1, 1);
rep(i,0,m-1)
{
int u=edges[edges_ord[i]].u,
v=edges[edges_ord[i]].v,
w=edges[edges_ord[i]].w;
bool ok=edges[edges_ord[i]].ok;
if(u==nope_pnt || v==nope_pnt) continue;
if(union_pa(u,v))
ans+=(1-ok)*w;
}
int cnt=0;
rep(i,1,n) if(i!= nope_pnt && find_pa(i)==i)
cnt++;
if(cnt==1) return ans;
else return INF;
} int
main()
{
scanf("%d%d", &n,&m);
rep(i,1,m)
{
int u,v,w,o;
scanf("%d%d%d%d", &u, &v, &w, &o);
add_edge(u,v,w,o==1);
}
iota(edges_ord, edges_ord+m, 0);
vector<int> ans_pnt;
int ans_val=0;
sort(edges_ord, edges_ord+m, [&](int x, int y) -> bool
{
if((1-edges[x].ok)*edges[x].w==
edges[y].w*(1-edges[y].ok))
return (edges[x].u<edges[y].u ||
(edges[x].u==edges[y].u &&
edges[x].v<edges[y].v));
else return (1-edges[x].ok)*edges[x].w<
edges[y].w*(1-edges[y].ok);
});
rep(nope_pnt,1,n)
{
int ans_tmp=kruskal(nope_pnt);
if(ans_tmp>ans_val)
{
ans_val=ans_tmp;
ans_pnt.clear();
ans_pnt.PB(nope_pnt);
}
else if(ans_tmp==ans_val)
ans_pnt.PB(nope_pnt);
}
if(ans_val==0) printf("0");
else
{
rep(i,0,int(ans_pnt.size())-1)
{
printf("%d", ans_pnt[i]);
if(i==int(ans_pnt.size())-1)
printf("\n");
else printf(" ");
}
}
return 0;
}

「日常训练」Battle Over Cities - Hard Version(PAT-TOP-1001)的更多相关文章

  1. 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)

    题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...

  2. 「日常训练」 Fire!(UVA-11624)

    与其说是训练不如说是重温.重新写了Java版本的代码. import java.util.*; import java.math.*; import java.io.BufferedInputStre ...

  3. 「日常训练」COMMON 约数研究(HYSBZ-1968)

    题意与分析 感谢https://www.cnblogs.com/Leohh/p/7512960.html的题解.这题话说原来不在我的训练范围,正好有个同学问我,我就拿来做做.数学果然不是我擅长的啊,这 ...

  4. 「日常训练」 Mike and Fun (CFR305D2B)

    题意(CodeForces 548B) 每次对01矩阵中的一位取反,问每次操作后,单列中最长连续1的长度. 分析 非常非常简单,但是我当时训练的时候WA了四次...无力吐槽了,人间 不值得.jpg 代 ...

  5. 「日常训练」Common Subexpression Elimination(UVa-12219)

    今天做的题目就是抱佛脚2333 懂的都懂. 这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的. 思路分析 做这条题我是先按照之前的那条题目(The SetSt ...

  6. 「日常训练」Magic Stones(CodeForces-1110E)

    题意 给定两个数组c和t,可以对c数组中的任何元素变换\(c_i\)​成\(c_{i+1}+c_{i-1}-c_i\)​,问c数组在若干次变换后能否变换成t数组. 分析 这种魔法题目我是同样的没做过. ...

  7. 「日常训练」Jongmah(Codeforces-1110D)

    题意 你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组? 分析 根据官方Editori ...

  8. 「日常训练」The Necklace(UVA-10054)

    代码 for(int i=0; i!=n; ++i) { int u = cin.nextInt(); int v = cin.nextInt(); edges.add(new Edge(u,v)); ...

  9. 「日常训练」Known Notation(ZOJ-3829)

    题意与分析 题意是这样的:给一个字符串,字符串中只包含数字和运算符'*'.现在问字符串是不是一个合法的逆波兰式(后缀表达式).已知逆波兰式的空格消除,也就是说123可以看成123也可以看成1和23.如 ...

随机推荐

  1. 2019.1.6 2.8 Spring的AOP事务

    2.8 Spring的AOP事务 xml配置aop事务 先applicationContext.xml 文件 配置事务管管理器 配置通知 织入目标对象

  2. 【转】计算Java List中的重复项出现次数

    本文演示如何使用Collections.frequency和Map来计算重复项出现的次数.(Collections.frequency在JDK 1.5版本以后支持) package com.qiyad ...

  3. C# .NET开发图形图像程序时提示"GDI+ 中发生一般性错误"

    今天突然收到一封信,说我那个极度复杂的Marshal的问题被解决了(http://www.cnblogs.com/hotcan/archive/2005/01/12/91007.html).顿时感觉好 ...

  4. NOIP2018(更新中)

    \(Day_1T_1\) 铺设道路 (Link) 现在你有一个序列,每一个\(i\)有一个深度\(Deep[i]\),现在你可以选择任意的区间,将整个区间的\(Deep\)都减少\(1\).但前提是这 ...

  5. 【题解】洛谷P2679 [NOIP2015TG] 子串(DP+滚动数组)

    次元传送门:洛谷P2679 思路 蒟蒻一开始并没有思路而去看了题解 我们发现对于两个字串的位置 我们只需要管他们匹配成功或者匹配失败即可 f[i][j][k] 记录当前 a[i]不论等不等于b[j] ...

  6. init/loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法

    init/loadView/viewDidLoad/viewDidUnload 这么细节的东西想来大家都不在意,平时也不会去关系,但是在面试时却常常被提到,所以了解viewController的生命周 ...

  7. C#通过拼接协议的方式来发送邮件类库

    using System; using System.Collections.Generic; using System.Net; using System.Net.Mail; using Syste ...

  8. sql中UNION和UNION ALL的区别

    写sql时我们经常会遇到需要把从多张表查询的集果集进行合并.这时就用到了union.使用union或union all 时一定要保证查询的列的一致性 .不然sql会报错.字段不一致的话可以用单引号来占 ...

  9. 有了SSL证书,如何在IIS环境下部署https?

    昨天各位小伙伴都很开心的领取了自己的SSL证书,但是大部分小伙伴却不知道如何部署,也许是因为第一次接触SSL这种高端的东西吧,不过个人觉得就是懒懒懒...本来小编也挺懒的,但是答应了各位小伙伴的,那么 ...

  10. Python系列之入门篇——pytables及其客户端

    pytables及其客户端查看 pytables # ubuntu sudo apt-get install python-tables pip install flask flask-httpaut ...