ZOJ 4109 Welcome Party
题目链接:(https://zoj.pintia.cn/problem-sets/91827364500/problems/91827370504)(https://vjudge.net/problem/ZOJ-4109)
题面复制不过来。
题意:n个人,编号为1~n,m个朋友关系(a和b是朋友,a和c是朋友不代表b和c是朋友),将n个人按照顺序排好,如果一个人前面没有他的朋友那么不满意度加一,让你给出一个排序使得不满意度最小化,有相同结果的排序输出字典序最小的那个。
有关系存在,考虑画图。画完图后发现不满意度的最小值即是图的连通分量的个数,因为每当选定一个连通分量的的人进入序列,与他连接的人就可以都顺着连接加入序列,从而不会增加不满意度。求连通分量个数可用并查集实现。
要求输出字典序最小的,想到了用优先队列实现的bfs,优先选择队列中编号最小的点。
因为用memset导致超时好几次,初始化时最好用多少初始化多少。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
typedef long long ll;
using namespace std; const int N=1e6+; struct cmp {
bool operator()(int a,int b) {
return a>b;
}
}; priority_queue <int,vector <int>,cmp> Q; int E[N<<],fir[N],nex[N<<],tot;
int per[N];
bool vis[N];
bool book[N];
int n,m,cnt; void init() {
for(int i=;i<=n;i++) {
per[i]=i;fir[i]=-;vis[i]=false;book[i]=false;
}
cnt=tot=;
} void connect(int from,int to) {
E[tot]=to;
nex[tot]=fir[from];
fir[from]=tot++;
E[tot]=from;
nex[tot]=fir[to];
fir[to]=tot++;
} int root(int x) {
int tempa,tempb;
tempa=x;
while(x!=per[x]) x=per[x];
while(per[tempa]!=x) {
tempb=per[tempa];
per[tempa]=x;
tempa=tempb;
}
return x;
} void merge(int x,int y) {
int t1=root(x);
int t2=root(y);
if(t1!=t2) {
per[t1]=t2;cnt++;
}
} void solve() {
int cnt=;
while(!Q.empty()) {
int q=Q.top();Q.pop();
if(vis[q]) continue;
vis[q]=true;
cnt++;
printf("%d",q);
if(cnt!=n) printf(" ");
for(int i=fir[q];i!=-;i=nex[i]) {
int to=E[i];
if(!vis[to]) Q.push(to);
}
}
printf("\n");
} int main() {
int t;
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&m);
init();
for(int i=;i<=m;i++) {
int x,y;
scanf("%d%d",&x,&y);
connect(x,y);
merge(x,y);
}
printf("%d\n",n-cnt);
for(int i=;i<=n;i++) {
if(!book[root(i)]) {
book[root(i)]=true;
Q.push(i);
}
}
solve();
}
return ;
}
ZOJ 4109 Welcome Party的更多相关文章
- ZOJ People Counting
第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ 3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...
- ZOJ 3686 A Simple Tree Problem
A Simple Tree Problem Time Limit: 3 Seconds Memory Limit: 65536 KB Given a rooted tree, each no ...
- ZOJ Problem Set - 1394 Polar Explorer
这道题目还是简单的,但是自己WA了好几次,总结下: 1.对输入的总结,加上上次ZOJ Problem Set - 1334 Basically Speaking ac代码及总结这道题目的总结 题目要求 ...
- ZOJ Problem Set - 1392 The Hardest Problem Ever
放了一个长长的暑假,可能是这辈子最后一个这么长的暑假了吧,呵呵...今天来实验室了,先找了zoj上面简单的题目练练手直接贴代码了,不解释,就是一道简单的密文转换问题: #include <std ...
- ZOJ Problem Set - 1049 I Think I Need a Houseboat
这道题目说白了是一道平面几何的数学问题,重在理解题目的意思: 题目说,弗雷德想买地盖房养老,但是土地每年会被密西西比河淹掉一部分,而且经调查是以半圆形的方式淹没的,每年淹没50平方英里,以初始水岸线为 ...
- ZOJ Problem Set - 1006 Do the Untwist
今天在ZOJ上做了道很简单的题目是关于加密解密问题的,此题的关键点就在于求余的逆运算: 比如假设都是正整数 A=(B-C)%D 则 B - C = D*n + A 其中 A < D 移项 B = ...
- ZOJ Problem Set - 1001 A + B Problem
ZOJ ACM题集,编译环境VC6.0 #include <stdio.h> int main() { int a,b; while(scanf("%d%d",& ...
- zoj 1788 Quad Trees
zoj 1788 先输入初始化MAP ,然后要根据MAP 建立一个四分树,自下而上建立,先建立完整的一棵树,然后根据四个相邻的格 值相同则进行合并,(这又是递归的伟大),逐次向上递归 四分树建立完后, ...
- ZOJ 1958. Friends
题目链接: ZOJ 1958. Friends 题目简介: (1)题目中的集合由 A-Z 的大写字母组成,例如 "{ABC}" 的字符串表示 A,B,C 组成的集合. (2)用运算 ...
随机推荐
- php 连接oracle插入多张图片的方法
php连接oracle数据库的时候,其查询.更新.删除数据和MySQL类似,但是增加数据.特别是图片的时候就很不一样,这里面涉及到要创建一个blob对象,用blod对象去保存php图片,下面是当插入多 ...
- QuickSort(快速排序)原理及C++代码实现
快速排序可以说是最重要的排序,其中延伸的思想和技巧非常值得我们学习. 快速排序也使用了分治的思想,原理如下: 分解:数组A[p..r]被划分为两个(可能为空)子数组A[p..q-1]和A[q+1..r ...
- 树状数组 hdu2689 hdu2838
题意:给定一个正整数n,和一个1-n的一个排列,每个数可以和旁边的两个数的任意一个交换,每交换一次总次数就要加一,问将这个排列转换成一个递增的排列需要多少次交换? 题意可以转换成求这个排列的逆序对数. ...
- Null Hypotheses| Alternative Hypotheses|Hypothesis Test|Significance Level|two tailed |one tailed|
9.1 The Nature of Hypothesis Testing Over the years, however, null hypothesis has come to mean simpl ...
- vue表格业务
https://www.jianshu.com/p/79f39f2c1382 https://blog.csdn.net/zhongshijun521/article/details/78390614 ...
- @echo off 批处理
一个批处理文件 @echo off ipconfig /all @pause -------------------------------- @echo off 是什么意思 就是说关闭回显@echo ...
- 使用dtree构建框架导航
前言: 该例子就是个框架导航 , 左边包含dtree的框架,点击上面的节点右边框架显示 说明步骤: 1. 首先获得dtree http://www.destroydrop.com/javascrip ...
- php配置memcached的扩展。
(一)安装memcached服务器 1根据系统下载相应版本的memcached服务器版本:如win7(64位=====>memcached-win64/memcached.exe 2.解压到目录 ...
- spring学习笔记四:AOP
AOP(Aspect Orient Programming),面向切面编程,是对面向对象编程OOP的一种补充 面向对象编程使用静态角度考虑程序的结构,而面向切面编程是从动态角度考虑程序运行过程 AOP ...
- 实现一个简易的HashMap
实现一个键的类型为int,值的类型为int的HashMap 输入一个T,表示操作次数: 之后每行接一个操作,可以包括插入.删除.修改.查询.清空.判断是否有这个键: 因为是刚学完随手敲的,所以功能粗糙 ...