集训Day6
2024-08-24 20:32:08
今天的图论题略多
但好像都是noip题
bzoj3624
有一个图,边是黑色或者白色,求一个生成树满足恰好有k条白边
贪心
我们把最小生成树上的白边叫做“富家子弟”,把不在树上的叫“贫下中农”
很明显,如果富家子弟超过k个,无解
否则我们先记录富家子弟,然后加入若干贫下中农直至有k条白边
然后加入剩下的黑边让图连通即可
bzoj4596
一个不超过17个点的无重边无自环的图
每个公司可以建一个集合里的边
一共n个点n个公司
求一个生成树满足这n-1个点分别由n-1个公司建成
矩阵树板子题
考虑容斥原理
答案为
[最小生成树的数量]-[一个公司没有建的数量]+[两个公司没有建的数量] ...
二进制枚举一下就可以了,毕竟17
bzoj3007
一个$r \times c$的矩形
从$(1,1)$走一条路径到$(r,c)$
这个矩形里有n个boss,你的路径要满足离boss的最近距离最远
$n \leq 3000$
首先,根据题目描述我们可以二分答案/滑稽
我们二分到一个mid就是以所有boss为圆心,mid为半径画一个圆
用最小割思想建出对偶图(反向对偶¿
原图矩形左下到右上连通等价于对偶图里左下到右上不连通
我们用画出的圆做一下noip2017D2T1的并查集就可以了
(我没见过自己鞭尸自己的
#include <iostream>
#include <cstdio>
#include <cctype>
using namespace std;
const int maxn = ;
const int maxm = ;
int n, m, k, fa[maxn], cnt0, cnt1, num;
bool chs[maxm];
struct edge
{
int u, v, c;
} e[maxm]; inline int read()
{
int x=,f=;char ch;
for(ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')f=-f;
for(;isdigit(ch);ch=getchar())x=*x+ch-'';
return x*f;
} int find(int u)
{
return fa[u] == u ? u : fa[u] = find(fa[u]);
} int main()
{
n = read();
m = read();
k = read();
for (int i = ; i <= n; i++) fa[i] = i;
for (int i = ; i <= m; i++)
{
e[i].u = read();
e[i].v = read();
e[i].c = read();
}
for (int i = ; i <= m; i++)
{
if (e[i].c == )
{
int r1 = find(e[i].u);
int r2 = find(e[i].v);
if (r1 != r2)
{
fa[r1] = r2;
++cnt1;
}
}
}
for (int i = ; i <= m; i++)
{
if (e[i].c == )
{
int r1 = find(e[i].u);
int r2 = find(e[i].v);
if (r1 != r2)
{
chs[i] = ;
fa[r1] = r2;
++cnt0;
}
}
}
if (cnt0 + cnt1 != n - || cnt0 > k)
{
printf("no solution\n");
return ;
}
for (int i = ; i <= n; i++) fa[i] = i;
cnt0 = cnt1 = ;
for (int i = ; i <= m; i++)
{
if (chs[i])
{
int r1 = find(e[i].u);
int r2 = find(e[i].v);
if (r1 != r2)
{
fa[r1] = r2;
++cnt0;
}
}
}
for (int i = ; i <= m; i++)
{
if (e[i].c == && cnt0 < k)
{
int r1 = find(e[i].u);
int r2 = find(e[i].v);
if (r1 != r2)
{
chs[i] = ;
fa[r1] = r2;
++cnt0;
}
}
}
if (cnt0 != k)
{
printf("no solution\n");
return ;
}
for (int i = ; i <= m; i++)
{
if (e[i].c == )
{
int r1 = find(e[i].u);
int r2 = find(e[i].v);
if (r1 != r2)
{
chs[i] = ;
fa[r1] = r2;
}
}
}
for (int i = ; i <= m; i++)
if (chs[i])
printf("%d %d %d\n", e[i].u, e[i].v, e[i].c);
return ;
}
T1
#include<bits/stdc++.h>
#define LL LL
using namespace std;
const int N=,M=;
const int mod=1e9+;
struct node{int x,y;}t[M][N];
LL C[M][M];int m[M];
LL Guass(int n)
{
LL ans=;
for(int i=;i<=n;i++)
{
for(int j=i+;j<=n;j++)
{
LL a=C[i][i],b=C[j][i];
while(b)
{
LL temp=a/b;a%=b;swap(a,b);
for(int k=i;k<=n;k++) C[i][k]=(C[i][k]-temp*C[j][k]%mod+mod)%mod,swap(C[i][k],C[j][k]);
ans=-ans;
}
}
if(!C[i][i]) return ;
ans=ans*C[i][i]%mod;
}
ans=(ans%mod+mod)%mod;
return ans;
}
int main()
{
int n;scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d",&m[i]);
for(int j=;j<=m[i];j++) scanf("%d%d",&t[i][j].x,&t[i][j].y);
}
LL ans=;
for(int i=;i<(<<n-);i++)
{
memset(C,,sizeof(C));
int num=;
for(int j=;j<n;j++)
{
if(!(i&(<<j-))) continue;
num++;
for(int k=;k<=m[j];k++)
{
int a=t[j][k].x,b=t[j][k].y;
C[a][b]--;C[b][a]--;
C[a][a]++;C[b][b]++;
}
}
if((n--num)%) ans-=Guass(n-);
else ans+=Guass(n-);
ans=(ans%mod+mod)%mod;
}
printf("%lld\n",ans);
return ;
}
T2
#include <bits/stdc++.h>
#define N 3010
using namespace std;
int f[N];
double x[N] , y[N];
int find(int x)
{
return x == f[x] ? x : f[x] = find(f[x]);
}
void merge(int x , int y)
{
int tx = find(x) , ty = find(y);
if(tx != ty) f[tx] = ty;
}
int main()
{
int n , i , j , cnt = ;
double a , b , l = , r , mid;
scanf("%d%lf%lf" , &n , &a , &b) , r = min(a , b);
for(i = ; i <= n ; i ++ ) scanf("%lf%lf" , &x[i] , &y[i]);
while(cnt -- )
{
mid = (l + r) / ;
for(i = ; i <= n + ; i ++ ) f[i] = i;
for(i = ; i <= n ; i ++ )
{
if(mid >= x[i] - || mid >= b - y[i]) merge(i , );
if(mid >= a - x[i] || mid >= y[i] - ) merge(i , n + );
for(j = ; j < i ; j ++ )
if((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) <= * mid * mid)
merge(i , j);
}
if(find() == find(n + )) r = mid;
else l = mid;
}
printf("%.2lf\n" , l);
return ;
}
T3
最新文章
- mac系统xcode升级等软件更换appid账户
- 如何在Ubuntu 14.04中安装最新版Eclipse
- 数据库链接 mysql,sqlserver
- 为什么用 Java:一个 Python 程序员告诉你
- 在 iOS 应用中直接跳转到 AppStore 的方法--备用
- Linux散列表(二)——宏
- getsockname和getpeername函数
- Mysql 视图笔记2
- Spring Web MVC中的页面缓存支持 ——跟我学SpringMVC系列
- 面向亿万级用户的QQ一般做什么?——兴趣部落的 Web 同构直出分享
- BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]
- ch7复用类
- 20 ViewPager demo5,6:FragmentAdapter 导航数据
- Java四大名著下载大全(中文+英文)
- Java8-Optional与null
- 7I - 数塔
- Android 设计模式对比
- 20165314 2016-2017-2 《Java程序设计》第8周学习总结
- sklearn逻辑回归
- Shell学习笔记一
热门文章
- ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借
- js 第二篇 (DOM 操作)
- linux下网卡绑定
- 15 redis 之 aof恢复与rdb服务器间迁移
- java 常用设计模式(转载)
- 模式匹配之surf----特征点检测学习_2(surf算法)
- 初学shell,为了练习sed,写了个简单的批量修改文件名的脚本,后来执行时发现系统竟然自带有一个rename命令,顺便也记下了
- (转)ConcurrentModificationException异常原因和解决方法
- 解决因 gtx 显卡而导致的 google chrome 颜色显示不正常。色彩变淡发白,其实很简单
- EasyDSS流媒体解决方案之多方式虚拟直播方法