「日常训练」Battle Over Cities - Hard Version(PAT-TOP-1001)
题意与分析
题意真的很简单,实在不想讲了,简单说下做法吧。
枚举删除每个点,然后求最小生成树,如果这个路已经存在那么边权就是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)的更多相关文章
- 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)
题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...
- 「日常训练」 Fire!(UVA-11624)
与其说是训练不如说是重温.重新写了Java版本的代码. import java.util.*; import java.math.*; import java.io.BufferedInputStre ...
- 「日常训练」COMMON 约数研究(HYSBZ-1968)
题意与分析 感谢https://www.cnblogs.com/Leohh/p/7512960.html的题解.这题话说原来不在我的训练范围,正好有个同学问我,我就拿来做做.数学果然不是我擅长的啊,这 ...
- 「日常训练」 Mike and Fun (CFR305D2B)
题意(CodeForces 548B) 每次对01矩阵中的一位取反,问每次操作后,单列中最长连续1的长度. 分析 非常非常简单,但是我当时训练的时候WA了四次...无力吐槽了,人间 不值得.jpg 代 ...
- 「日常训练」Common Subexpression Elimination(UVa-12219)
今天做的题目就是抱佛脚2333 懂的都懂. 这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的. 思路分析 做这条题我是先按照之前的那条题目(The SetSt ...
- 「日常训练」Magic Stones(CodeForces-1110E)
题意 给定两个数组c和t,可以对c数组中的任何元素变换\(c_i\)成\(c_{i+1}+c_{i-1}-c_i\),问c数组在若干次变换后能否变换成t数组. 分析 这种魔法题目我是同样的没做过. ...
- 「日常训练」Jongmah(Codeforces-1110D)
题意 你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组? 分析 根据官方Editori ...
- 「日常训练」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)); ...
- 「日常训练」Known Notation(ZOJ-3829)
题意与分析 题意是这样的:给一个字符串,字符串中只包含数字和运算符'*'.现在问字符串是不是一个合法的逆波兰式(后缀表达式).已知逆波兰式的空格消除,也就是说123可以看成123也可以看成1和23.如 ...
随机推荐
- centos7 firewall指定IP与端口访问(常用)
1.启动防火墙 systemctl start firewalld.service 2.指定IP与端口 firewall-cmd --permanent --add-rich-rule="r ...
- vue通过watch对input做字数限定
<div id="app"> <input type="text" v-model="items.text" ref=&q ...
- 让Git不再难学
写在前面 在团队做过软件开发的,版本控制必是不可或缺的一项.目前,版本控制主要分为集中式版本控制系统和分布式版本控制系统 ,即大家熟知的SVN和Git.Git是当下最流行的分布式版本控制系统,故,今天 ...
- SQL Server遍历所有表统计行数
DECLARE CountTableRecords CURSOR READ_ONLY FOR SELECT sst.name, Schema_name(sst.schema_id) FROM sys. ...
- OSD仿真_MFC程序01
Windows系统具有强大的绘图功能,可以用来模拟OSD显示.接下来将设计一个简单的模拟显示终端的程序,用于后续显示功能和菜单系统的开发.说明一下,对于Windows下的MFC编程我不怎么了解,只知道 ...
- Python书单
gitbook.jb51 1.Python基础教程 2.流畅的Python:总有论坛的人吐槽它翻译的还是不太友好,其实真正的差别没有那么大,重要的还是有所收获 3.<Python进阶>译本 ...
- html中defer和window.onload的加载顺序
结论:defer执行的顺序先于window.onload! 案例: html代码: <!DOCTYPE html> <html lang="en"> < ...
- 解决vue变量未渲染前代码显示问题
在网络加载缓慢或者刷新的时候总会有那么一瞬间出现vue的模板代码,实在很影响美观,对于我这种有强迫症的人来说实在是忍无可忍,后来经过查找资料,终于发现了解决方法,可以使用vue现成的指令来解决这个问题 ...
- HDU Ellipse(simpson积分)
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- html 让table表格中的td单元格内容过长显示为固定长度,多余部分用省略号代替?
<th class="wrap">商品名</th> .wrap{ width: 150px; //设置需要固定的宽度 white-space: nowrap ...