vis

网络流强化-HDU2732

孤人 提交于 2019-11-27 15:12:02
  第一次遇到加了“多余”的边会导致WA的——在我看来是很多余,见代码191行   之后会思考为什么,想出来再更。    //http://www.renfei.org/blog/isap.html 带解释的 //https://www.cnblogs.com/bosswnx/p/10353301.html 形式和我的比较相近的 #include<cstdio> #include<cstring> #include<cmath> using namespace std; #define maxe 100024 //pay 双向边 一共10万条路 双向就是20万 反边就是40万 #define maxv 1024 //pay #define maxn 25 //pay #define sc scanf #define pt printf #define rep(i,a,b) for(int i=(a);i<(b);++i) const int inf = 0x3f3f3f3f; int cg,sp,ins; //cg change sp是总流量 ins是加速回溯点 int N,M,T,D ,s,t,delta; int q[maxv],fro,rea; typedef struct ed{ int v,nxt,cap; //dis }ed; ed e[maxe]; int tot

Codeforces Round #539 (Div. 2)

别说谁变了你拦得住时间么 提交于 2019-11-27 13:56:51
题目链接: http://codeforces.com/contest/1113 A:贪心,开始加满,后面用一站加一站。 1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 std::ios::sync_with_stdio(false); 6 int n, k; 7 cin >> n >> k; 8 n -= 1; 9 int ans = 0; 10 if(k >= n) ans = n; 11 else{ 12 for(int i = 1;i <= n - k;i++) ans += i + 1; 13 ans += k; 14 } 15 cout << ans << endl; 16 return 0; 17 } View Code B:预处理,100以内所有变化,用总得减去变化最多的就是答案最少的,一开始做没瞅着只能变俩个数。 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn =105; 4 int vis[maxn]; 5 int d[maxn][maxn]; 6 int main() 7 { 8 std::ios::sync_with_stdio(false); 9 int n; 10 cin >> n;

1021 Deepest Root (25 分)

我的未来我决定 提交于 2019-11-27 13:03:13
1021 Deepest Root (25 分) A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root that results in a highest tree. Such a root is called the deepest root. Input Specification: Each input file contains one test case. For each case, the first line contains a positive integer N ( ≤) which is the number of nodes, and hence the nodes are numbered from 1 to N. Then N − 1 lines follow, each describes an edge by given the two adjacent nodes' numbers. Output Specification: For each test case, print each of

网络流强化-UVA10480

岁酱吖の 提交于 2019-11-27 12:24:29
  做这道题,自己先是想了好几种找被割的边的方法——都被否决了。   后来发现是最小割:只要一条边的两端在不同的点集里面就代表是被割掉的满流边(这些满流边的流量和等于最大流的流量与最小割的权值和)。   但是之前自己想了一个例子,    10 11 1 4 3 4 3 3 3 2 3 4 5 100 5 6 100 6 7 100 7 2 100 1 8 100 8 9 100 9 10 100 10 3 100 0 0   首先这个例子我自己误判了,以为最大流的流量是6,只要割掉1-4和3-2就行——就是脑子短路了,所以我还反过来怀疑双向边,再怀疑DFS和BFS寻找割集的方法,最后居然怀疑最大流和最小割的关系。   后来用了别人的代码,发现我自己解出来的最大流量值错了;但是用自己编的数据(在上面的基础上修改的):    10 11 1 4 3 4 3 3 3 2 3 4 5 3 5 6 100 6 7 100 7 2 100 1 8 100 8 9 100 9 10 100 10 3 100 0 0   她居然给我跑出来了三条容量为3的边,这就是为什么我怀疑最大流和最小割的关系的原因,后来发现人家在寻找源点能到的点集的时候,不仅要求边的剩余流量大于0,还要求基础的cap容量要大于0,这样的做法是错的。修改之后就好了。   AC代码:   //http://www.renfei

[Luogu] P3225 [HNOI2012]矿场搭建

烂漫一生 提交于 2019-11-27 11:15:06
题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。 请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数。 题目解析 tarjan找双联通分量,找割点。 在一个分量里有 ≥2 个割点,这个分量就怎么都能跑出去,不需要建出口。 在一个分量里有 1 个割点,这个分量就要防止割点塌了,需要建1个出口。 在一个分量里没有割点,说明它不和别的分量连通,为了防止出口塌掉,要建两个出口。 看起来有些坑,值得注意的是,一个点只会在一个强连通分量,但可能同时处于多个双联通分量 Code #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 500 + 5; struct Edge { int nxt; int to; } l[MAXN<<1]; int n,m,res,T; int tot,stamp; int head[MAXN],cnt; int low[MAXN],dfn[MAXN]; int sum,num; int root,deg;

浅谈差分约束系统

陌路散爱 提交于 2019-11-27 10:45:39
前置芝士:SPFA判负环 对于差分约束系统,就是来解决一系列类似下面的问题: 差分约束系统是一种特殊的 \(N\) 元一次不等式组,它包含 \(N\) 个变量 \(X_1...X_n\) 以及 \(M\) 个约束条件。每个约束条件都是由两个变量做差构成的。 我们要求的是,一组解 \(X_1=a,X_2=b...\) 满足所有的约束条件。 对于每一个不等式,我们都可以变形成 \(X_i-X_j<=C\) 的形式,而移项之后,我们会发现它与最短路算法的松弛操作很相似。也就是说,我们可以从 \(j\) 向 \(i\) 连一条边长为 \(C\) 的有向边,跑最短路。 对于形如 \(X_i-X_j>=C\) 的形式,两边乘以 \(-1\) 即可。 对于建出来的图,如果存在负环则无解,否则 \(X_i=dis[i]\) 就是一组解。 对于判负环,那显然就要用到我们的 \(Spfa\) 了。 例1: \(luogu\) \(P1993\) 显然是一道差分约束的裸题。这是最直接的模型,直接跑即可。 代码: #include<cstdio> #include<iostream> #include<queue> #include<cstring> #define MAXN 10001<<1 using namespace std; inline int read(){ int s=0,w=1;

2019牛客多校第⑨场D Knapsack Cryptosystem(折半搜索)

故事扮演 提交于 2019-11-27 10:35:59
题意:给定大小为n(<=36)的集合a,整数s,求a的一个和为s的子集(有且只有一个) 直接搜索要 \(2^{36}\) 次,时间过多,考虑一次搜索前半集合,一次搜索后半集合,得到两个 \(2^{16}\) 的答案数组,就变成了双数组匹配问题 #include <algorithm> #include <iostream> #include <cstdio> using namespace std; typedef long long ll; const ll maxn=1e6+5; struct node{ ll vis,v;//用二进制数vis表示元素的选择情况 node(ll a=0,ll b=0):vis(a),v(b){} bool operator<(node b){ return v<b.v; } }N[maxn]; ll a[40]; ll n,half,cnt; ll s; void dfs(ll cur,ll sum,ll vis){ if(sum>s)return; if(cur==half){ N[++cnt].vis=vis; N[cnt].v=sum; return; } if(a[cur]+sum<=s) dfs(cur+1,sum+a[cur],vis|1<<(cur-1)); dfs(cur+1,sum,vis); } void dfs_(ll

NOIP2015运输计划的一个O(n)解法

偶尔善良 提交于 2019-11-27 10:22:54
一个O(n)的解法。 不难发现有如下性质: 被改造成虫洞的边一定在最长路径上 那么,我们用类似提直径的方法把 这条路径给拎出来 就会形成这样的一棵树。 那么,对于一条边,若其被改成虫洞,最长路径会有如下三种情况: 依然是当前的最长路径 被改造边左端点的最长路径 被改造边右端点的最长路径 难道我们不用考虑经过该边的路径吗?? 当然不用。 我们已经是在 最长路径 上改造边了, 而最长路径是长于任何一条路径的 (废话),那么经过该边的任何路径在此边被改造后 依然短于最长路径 ,故不用考虑。 至于求两端的最长路径,我们可以前缀和后缀分别维护一下。 那么怎么求前缀(后缀)呢? 我们可以在每个点开个vector,对于一条路径,我们把另一端点以及路径的编号加到vector中。 然后,再开个vis数组,表示这个点是否被访问过。 在遍历时,我们访问所有以这一点为一端点的路径标号 \(id\) 和另一端点 \(y\) ,若另 \(vis[y]=true\) ,就拿 \(id\) 的长度去更新即可。(口胡不清,这最好手动模拟一下) 至于求路径长和LCA呢? 额,树剖我是当常数看的。。。 实在不行你可以Tarjan离线预处理啊 代码( 巨丑无比 ): #include<bits/stdc++.h> #define reg register int #define MAXN 300010 using

【分数规划】

烂漫一生 提交于 2019-11-27 10:22:07
分数规划 资料 这样一类问题,给定两个数组,benifit[i]表示选取i的收益,cost[i]表示选取i的代价。如果选取i,定义x[i]=1否则x[i]=0。每一个物品只有选或者不选两种方案,求一个选择方案使得 \(R=\sum(benifit[i]*x[i])/\sum(cost[i]*x[i])\) 取得最值,即所有选择物品的总收益与总代价的比值最大或是最小 实战 POJ2976Dropping tests 普通01分数规划 题意:给出n个a和b,让选出n-k个使得 \((\sum a[i])/(\sum b[i])\) 最大 普通分数规划 就是因为是实数要注意一些小细节 二分 #define ll long long #define Abs(x) ((x)(y)?(x):(y)) #define Min(x,y) ((x) #include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> using namespace std; #define ll long long #define Abs(x) ((x)<0?-(x):(x)) const int N=1000+5,M=5e5+5,INF=1e9+7,inf=0x3f3f3f3f; const double

[bzoj1070]修车

蹲街弑〆低调 提交于 2019-11-27 09:52:08
首先,源点向每一个车主连(1,0)的边,然后把每一个工人拆成n个点,第i个点表示修倒数第i辆车,那么这辆车对答案的代价就是time*i(time表示这辆车的时间,i表示倒数第i辆),就是说每一个车主向nm个工人的点连(1,time*i)的边。最后,每一个工人的点向汇点连(1,0)的边即可。 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 1005 4 #define oo 0x3f3f3f3f 5 struct ji{ 6 int nex,to,len,cost; 7 }edge[N*70]; 8 queue<int>q; 9 int E,n,m,t,head[N],from[N],d[N],vis[N]; 10 void add(int x,int y,int z,int w){ 11 edge[E].nex=head[x]; 12 edge[E].to=y; 13 edge[E].len=z; 14 edge[E].cost=w; 15 head[x]=E++; 16 if (E&1)add(y,x,0,-w); 17 } 18 bool spfa(){ 19 memset(vis,0,sizeof(vis)); 20 memset(d,oo,sizeof(d)); 21 d[0]=0; 22 q