今天的图论题略多

但好像都是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

最新文章

  1. mac系统xcode升级等软件更换appid账户
  2. 如何在Ubuntu 14.04中安装最新版Eclipse
  3. 数据库链接 mysql,sqlserver
  4. 为什么用 Java:一个 Python 程序员告诉你
  5. 在 iOS 应用中直接跳转到 AppStore 的方法--备用
  6. Linux散列表(二)——宏
  7. getsockname和getpeername函数
  8. Mysql 视图笔记2
  9. Spring Web MVC中的页面缓存支持 ——跟我学SpringMVC系列
  10. 面向亿万级用户的QQ一般做什么?——兴趣部落的 Web 同构直出分享
  11. BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]
  12. ch7复用类
  13. 20 ViewPager demo5,6:FragmentAdapter 导航数据
  14. Java四大名著下载大全(中文+英文)
  15. Java8-Optional与null
  16. 7I - 数塔
  17. Android 设计模式对比
  18. 20165314 2016-2017-2 《Java程序设计》第8周学习总结
  19. sklearn逻辑回归
  20. Shell学习笔记一

热门文章

  1. ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借
  2. js 第二篇 (DOM 操作)
  3. linux下网卡绑定
  4. 15 redis 之 aof恢复与rdb服务器间迁移
  5. java 常用设计模式(转载)
  6. 模式匹配之surf----特征点检测学习_2(surf算法)
  7. 初学shell,为了练习sed,写了个简单的批量修改文件名的脚本,后来执行时发现系统竟然自带有一个rename命令,顺便也记下了
  8. (转)ConcurrentModificationException异常原因和解决方法
  9. 解决因 gtx 显卡而导致的 google chrome 颜色显示不正常。色彩变淡发白,其实很简单
  10. EasyDSS流媒体解决方案之多方式虚拟直播方法