vis

UPC9630 Mad Veterinarian

∥☆過路亽.° 提交于 2019-11-28 20:25:26
问题 G: Mad Veterinarian 时间限制: 1 Sec 内存限制: 128 MB Special Judge 提交: 23 解决: 8 [ 提交 ] [ 状态 ] [命题人: admin ] 题目描述 Mad Veterinarian puzzles have a mad veterinarian, who has developed several machines that can transform an animal into one or more animals and back again. The puzzle is then to determine if it is possible to change one collection of animals into another by applying the machines in some order (forward or reverse). For example: Machine A turns one ant into one beaver. Machine B turns one beaver into one ant, one beaver and one cougar. Machine C turns one cougar into one ant and one beaver.

Codeforces Round #585 (Div. 2)

拈花ヽ惹草 提交于 2019-11-28 20:22:44
https://www.cnblogs.com/31415926535x/p/11553164.html 感觉很硬核啊这场,,越往后越做不动,,,emmmm,,,(这场是奔着最后一题 2sat 来的,,,上次学这玩意是在今年的3、4月份把,,,早忘得差不多了,,, A. Yellow Cards A题较简单,,贪心就行了,, #include <bits/stdc++.h> #define aaa cout<<233<<endl; #define endl '\n' using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; // mt19937 rnd(time(0)); const int inf = 0x3f3f3f3f;//1061109567 > 1e9 const ll linf = 0x3f3f3f3f3f3f3f3f; const double eps = 1e-6; const double pi = 3.14159265358979; const int maxn = 1e6 + 5; const int maxm = 2e5 + 233; const int mod = 1e9 + 7; int a[maxn], n;

【网络流24题】负载平衡问题

狂风中的少年 提交于 2019-11-28 19:56:44
这又是一道我没有当场想出来的题 题面 https://www.luogu.org/problemnew/show/P4016 题解 $S$连初始状态,末状态连$T$,转移边流量为$INF$,费用为$1$。 #include<cstdio> #include<cstring> #include<iostream> #include<vector> #include<queue> #define N 105 #define INF 1000000007 #define T (n+1) #define S 0 #define LL long long #define ri register int using namespace std; int n,a[N]; struct graph { vector<int> to,w,c; vector<int> ed[N]; LL dis[N]; int cur[N]; bool vis[N]; void add_edge(int a,int b,int aw,int ac) { to.push_back(b); w.push_back(aw); c.push_back(ac); ed[a].push_back(to.size()-1); to.push_back(a); w.push_back(0); c.push_back(-ac); ed

最短路计数

我的未来我决定 提交于 2019-11-28 19:37:01
题目描述 给出一个 N个顶点 M条边的无向无权图,顶点编号为 1 − N。问从顶点 1 开始,到其他每个点的最短路有几条。 输入格式 第一行包含 2个正整数 N , M,为图的顶点数与边数。 接下来 M行,每行 2个正整数 x , y,表示有一条顶点 x 连向顶点 y的边,请注意可能有自环与重边。 输出格式 共 N行,每行一个非负整数,第 i 行输出从顶点 1到顶点 i有多少条不同的最短路,由于答案有可能会很大,你只需要输出 ans mod 100003 后的结果即可。如果无法到达顶点 i 则输出 0。 一道简单题, 用SPFA去更新最短路, 每次更新时, 即dis[y] > dis[x] + v, 点y的最短路条数就等于点x的最短路条数, 而当dis[y] = dis[x] + v时, 就说明该点产生了第二条最短路, 即点y最短路的条数加上点x最短路的条数。 即使当前不是最短路, 但是当更新到最短路时, 该最短路条数数组会重置成此时点x的最短路条数, 所以这个算法是正确的。 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int INF = 0x3f3f3f3f; const int MAXN = 2e6 + 100; const int MAXM = 3e3 + 10;

网络流概念+EdmondKarp算法+Dinic(Dinitz)

半城伤御伤魂 提交于 2019-11-28 19:21:02
网络流问题在实际解决题目中有很多用处 有时可与二分图匹配相搭配(然而我还没有学二分图匹配2333) 所以我还是决定学一下网络流 于是便有了这篇博客 废话不多说 先介绍下概念 关于网络流的基本概念 图,边,点 设边(Edge)的集合为E 点(vertex)的集合为V 图为G 则G=(V,E) \(\color{pink}{S指源点(起点),T指汇点(终点)}\) \(\color{pink}{注意,这里E和V是集合,而G是一个二元组}\) \(\color{pink}{二元组:数据结构的一种(不是指信息的,也许信息也有 雾),二元组(D,R),D为数据元素的有限集,R为D的关系之间的有限集}\) \(\color{pink}{明显这里D指V,R指E}\) 容量网络 G(V,E)只不过要求 有向 相邻两点间的最大边大于0(c(u,v)>0) 则称G为容量网络 弧的流量 话说 我不懂为什么都叫它弧不叫边的2333 即实际流量用f(u,v)表示 网络流 即集合 f = { u \(\in\) V,v \(\in\) V-{u}|f(u, v) } 可行流 0 ≤ f(u,v) ≤ c(u,v) 平衡条件除源点S和汇点T外流入流量总和=流出流量总和 增广路 即一条从S到T的路径且路径上每条边残留容量都为正(c(u,v)-f(u,v)>0) 增广 将S到T的一条增广路拿出来,设其中的最小边权

题解 P1099 【树网的核】

不羁岁月 提交于 2019-11-28 17:31:46
提供四种复杂度的做法,希望能帮到大家 \(O\) ( \(n^3\) ): #include<bits/stdc++.h> using namespace std; #define go(i,a,b) for(int i=a;i<=b;++i) #define com(i,a,b) for(int i=a;i>=b;--i) #define mem(a,b) memset(a,b,sizeof(a)) typedef long long ll; const int N=300+10,inf=0x3f3f3f3f; int n,s,head[N],d[N],dis[N],f[N],ans=0,ans2=inf,cnt=0; bool vis[N]; vector<int>lng,cp; struct edge{ int nxt,v,w; }e[N*2]; void add(int u,int v,int w){ e[cnt]=(edge){head[u],v,w}; head[u]=cnt++; } void dfs(int u,int fa){ for(int i=head[u];i+1;i=e[i].nxt){ int v=e[i].v,w=e[i].w; if(v==fa) continue; d[v]=d[u]+w; dfs(v,u); } } void dfs2(int u

【NOIP2017】宝藏(状压DP/爆搜)

人走茶凉 提交于 2019-11-28 16:40:25
问题: 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度。 小明决心亲自前往挖掘所有宝藏屋中的宝藏。但是,每个宝藏屋距离地面都很远, 也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路 则相对容易很多。 小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某 个宝藏屋的通道,通往哪个宝藏屋则由小明来决定。 在此基础上,小明还需要考虑如何开凿宝藏屋之间的道路。已经开凿出的道路可以 任意通行不消耗代价。每开凿出一条新道路,小明就会与考古队一起挖掘出由该条道路 所能到达的宝藏屋的宝藏。另外,小明不想开发无用道路,即两个已经被挖掘过的宝藏 屋之间的道路无需再开发。 新开发一条道路的代价是: L×K L代表这条道路的长度,K代表从赞助商帮你打通的宝藏屋到这条道路起点的宝藏屋所经过的 宝藏屋的数量(包括赞助商帮你打通的宝藏屋和这条道路起点的宝藏屋) 。 请你编写程序为小明选定由赞助商打通的宝藏屋和之后开凿的道路,使得工程总代 价最小,并输出这个最小值。 解: 细数我做这道题的心历路程 首先我看到n这么小 我就先定义 了 $f[i]$ 表示集合 都遍历的最小花费                $dis[j]$ 表示j的深度 (我开始没看出来要选一棵树,还有深度

洛谷 P1219 八皇后题解

余生颓废 提交于 2019-11-28 16:26:20
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是跳棋放置的一个解。请编一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前3个解。最后一行是解的总个数。 //以下的话来自usaco官方,不代表洛谷观点 特别注意: 对于更大的N(棋盘大小N x N)你的程序应当改进得更有效。不要事先计算出所有解然后只输出(或是找到一个关于它的公式),这是作弊。如果你坚持作弊,那么你登陆USACO Training的帐号删除并且不能参加USACO的任何竞赛。我警告过你了! 输入格式 一个数字N (6 <= N <= 13) 表示棋盘是N x N大小的。 输出格式 前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。 输入输出样例 输入 #1 复制 6 输出 #1 复制 2 4 6 1 3 5 3 6 2 5 1 4 4 1 5 2 6 3 4 说明/提示 题目翻译来自NOCOW。 USACO Training Section 1.5 题解

洛谷1099 树网的核

北慕城南 提交于 2019-11-28 16:23:47
O( \(n^3\) )做法 #include<bits/stdc++.h> using namespace std; #pragma GCC optimize(3) #define go(i,a,b) for(int i=a;i<=b;++i) #define com(i,a,b) for(int i=a;i>=b;--i) #define mem(a,b) memset(a,b,sizeof(a)) #define fin freopen("input.txt","r",stdin) #define fout freopen("output.txt","w",stdout) #define re register #define int long long typedef long long ll; const int inf=0x3f3f3f3f; inline void read(int &x){ int f=1;char c=getchar();x=0; while(!isdigit(c)){if(c=='-') f=-1;c=getchar();} while(isdigit(c)){x=(x<<3)+(x<<1)+c-'0';c=getchar();} x*=f; }//读入优化 bool is_p(ll x){ for(int i=2;(ll)i*i<=x;++i)

20190825

纵饮孤独 提交于 2019-11-28 14:50:50
期望: 60 + 30 + 20 = 110.实际: 40 + 0 + 10 = 50. T1:给定一个正整数 M ,找出有多少不同的正整数对 (x, y) 使得存在正整数 p 和 q,满足下面这个方程:p*x 2 + q*y = M. S1:开局以为是数学题,套某个定理,想不到打了暴力,不知到>500的点为什么错了.后面跟dalao讨论,发现枚举的顺序有问题,导致TLE与WA.对于60pts,正确的打开方式应该为先枚举x( x<=sqrt ( m ) ),再枚举y( y<=m ),再枚举p.(p*x*x<m),一旦枚举到p,使x,y成立,就break.看上去o(n^3),其实为o(能过60pts).正解其实为暴力的优化,我们将p放在第二维枚举,第三维不枚举j,直接枚举m-x*x*p的因子,合法的y一定在其中,这样o(能过100pts)就解决了. #include<iostream> #include<cstring> #include<cstdio> #include<vector> using namespace std; #define re register int T,m,ans,vis[200010]; vector<int> v[200010]; inline int fd(){ int s=1,t=0; char c=getchar(); while(c<'0'|