Farmer John变得非常懒, 他不想再继续维护供奶牛之间供通行的道路. 道路被用来连接N (5 <= N <= 10,000)个牧场, 牧场被连续地编号为1..N. 每一个牧场都是一个奶牛的家. FJ计划除去P(N-1 <= P <= 100,000)条道路中尽可能多的道路, 但是还要保持牧场之间的连通性. 你首先要决定那些道路是需要保留的N-1条道路. 第j条双向道路连接了牧场S_j和E_j (1 <= S_j <= N; 1 <= E_j <= N…
往奶牛里打气 题目评级不难. 感觉思路有值得借鉴的地方.(虽然少,毕竟积沙成塔吗qwq) 很容易看出来,是要求最小生成树的. 然后生成树的计算方式不一样. 我们考虑拼接(感觉大部分oi都可以使用类似的方法,即是先假设一部分已知,求另一部分) 我们已经知道了一颗不全的生成树,现在在往里添加点. 很显然,多出来的部分就是所添加的两点的点权加上二倍的边权(就是走两次). 然后根绝上面.就可以写出算法. 不过开始点要多算一次.这个东西特判就好了. #include<cstdio> #include&l…
传送门 一次a就很开心 可以当作kruskal模板题(orz -------------------------------------------------------------------------------------- 约翰有N个牧场,编号依次为1到N.每个牧场里住着一头奶牛.连接这些牧场的有P条道路,每条道路都是双向的.第j条道路连接的是牧场Sj和Ej,通行需要Lj的时间.两牧场之间最多只有一条道路.约翰打算在保持各牧场连通的情况下去掉尽量多的道路. 约翰知道,在道路被强拆后,…
原题传送门 这道题用最小生成树来完成,我选用的是kruskal(克鲁斯卡尔)来完成.这道题目在克鲁斯卡尔模板的基础上,有变动的地方只有2处:1.因为必须从一个点出发,而最小生成树最后会让所有点都连通,所以最优的是从c[i]值最低的点出发,所以最后的total要加上最小的c[i]值.2.因为这道题目的权值很特殊,它包含了2*路的长度(来回走两次)+起点的c[i]+终点的c[i](这个也要花费时间),在读入的时候直接处理就可以了.代码就贴在这,因为考虑可能有些题目会卡输入,用了快读,介意的自己改一下…
思路: 跟昨天的考试题特别像-.. 就是裸的Kruskal 把边权设为连接的两个点的点权之和加上边权*2 搞定 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,m,c[10005],f[10005],minn=0x3fffffff,ans; struct Node{int from,to,weight;}node[100…
题目传送门:BZOJ 1232 这是一个边权和点权结合在一起的题,但是因为要从当前点出发并回到原点,所以每个边都被经过了两次,节点至少被经过一次,所以我们将边权重新赋值,所以推出 那么遍历之后,并不是最终结果,我们有个根节点未选择,所以对于当前这个树,我们可以寻找一个最小的点权来作为根节点,那么他会被多经过一次,加上即使最后答案: 所以就是修改边权跑最小生成树: 这里我作了kruskal做法: #include<bits/stdc++.h> using namespace std; int a…
1232: [Usaco2008Nov]安慰奶牛cheer Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 578  Solved: 403[Submit][Status] Description Farmer John变得非常懒, 他不想再继续维护供奶牛之间供通行的道路. 道路被用来连接N (5 <= N <= 10,000)个牧场, 牧场被连续地编号为1..N. 每一个牧场都是一个奶牛的家. FJ计划除去P(N-1 <= P <=…
1232: [Usaco2008Nov]安慰奶牛cheer Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 612  Solved: 431[Submit][Status] Description Farmer John变得非常懒, 他不想再继续维护供奶牛之间供通行的道路. 道路被用来连接N (5 <= N <= 10,000)个牧场, 牧场被连续地编号为1..N. 每一个牧场都是一个奶牛的家. FJ计划除去P(N-1 <= P <=…
目录 1 问题描述 2 解决方案   1 问题描述 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性.你首先要决定那些道路是需要保留的N-1条道路.第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间.没有两个牧场是被一…
安慰奶牛 cheer bzoj-1232 Usaco-2008 Nov 题目大意:给定一个n个点,m条边的无向图,点有点权,边有边权.FJ从一个点出发,每经过一个点就加上该点点权,每经历一条边就加上该边的边权.FJ必须经过所有点并回到出发点,求最小值. 注释:$1\le n\le 10^4$,$1\le m\le 10^5$. 想法: 显然最后的一条路径的并是整个图的一棵生成树. 紧接着我们发现,这个图的值就是欧拉遍历序上,如果出现了这个点,就加上这个点的点权.边权乘2. 所以我们将原图中的每条…
嘟嘟嘟 这道题删完边后是一棵树,那么一定和最小生成树有关啦. 考虑最后的生成树,无论从哪一个点出发,每一条边都会访问两次,而且在看一看样例,会发现走第w条边(u, v)的代价是L[w] * 2 + c[u] + c[v],所以说把每一条边的边权改为这个,然后跑裸的最小生成树就行了.然后答案还要加上出发的点的权值,那自然要加权值最小的点. #include<cstdio> #include<iostream> #include<algorithm> #include<…
思路:看出跟dfs的顺序有关就很好写了, 对于一棵树来说确定了起点那么访问点的顺序就是dfs序,每个点经过 其度数遍,每条边经过2边, 那么我们将边的权值×2加上两端点的权值跑最小生成树,最后加上一个最小的点的 权值最为dfs的起点. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define pii pair<int,int>…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1232 题意: 给你一个无向图,n个点,m条边. 每条边有边权len[i][j],每个点有点权c[i]. 让你找一棵生成树,并在这棵树上找一个根. 从根开始dfs整棵树,每经过一条边(或一个点),花费加上对应的边权(点权). 问你最小的花费. 题解: 树上dfs性质: 花费 = ∑ (2*len[i][j] + c[i] + c[j]) + c[root] (1)每一条边要经过两次. (2…
有趣 每条边在算答案的时候被算了二倍的边权值加上两个端点的权值,然后睡觉点额外加一次 所以可以用这个权做MST,然后加上点权最小的点 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=100005; int n,m,a[N],f[N],ans=1e9,con; struct qwe { int u,v,w; }e[N]; bool cmp(co…
[题解] 对于每一条边,我们通过它需要花费的代价是边权的两倍加上这条边两个端点的点权. 我们把每条边的边权设为上述的值,然后跑一边最小生成树,再把答案加上最小的点权就好了. #include<cstdio> #include<algorithm> using namespace std; ; ; int n,m,fa[maxn],c[maxn],tot; struct edge{int x,y,w;}e[maxn]; void read(int &k){ k=; ; cha…
问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计 划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性.你首先要决定那些道路是需要保留的N-1条道路.第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间.没有两个牧场是被一条以上的道路所连接.奶牛们非常伤心,因为她们的交通…
问题描述Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性.你首先要决定那些道路是需要保留的N-1条道路.第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间.没有两个牧场是被一条以上的道路所连接.奶牛们非常伤心,因为她们的交通系统…
Description Farmer John变得非常懒, 他不想再继续维护供奶牛之间供通行的道路. 道路被用来连接N (5 <= N <= 10,000)个牧场, 牧场被连续地编号为1..N. 每一个牧场都是一个奶牛的家. FJ计划除去P(N-1 <= P <= 100,000)条道路中尽可能多的道路, 但是还要保持牧场之间的连通性. 你首先要决定那些道路是需要保留的N-1条道路. 第j条双向道路连接了牧场S_j和E_j (1 <= S_j <= N; 1 <=…
问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性.你首先要决定那些道路是需要保留的N-1条道路.第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间.没有两个牧场是被一条以上的道路所连接.奶牛们非常伤心,因为她们的交通系…
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1232 这道题要保留的道路肯定是原图的一棵生成树,因为要保留n-1条边,且使删边后的图连通.但是这个图不能直接求最小生成树,因为还要考虑点权(即每头奶牛需要安慰的时间)的影响. 但是我们可以发现删边后的图,每条边必须走两次,一次过去一次回来.而且从每条边走过去.走回来时需要额外花费这条边两个端点的点权.所以,走每条边实际的花费=该边边权*2+两个端点点权之和.然后就可以愉快的跑最小生成…
问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性.你首先要决定那些道路是需要保留的N-1条道路.第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间.没有两个牧场是被一条以上的道路所连接.奶牛们非常伤心,因为她们的交通系…
%%%小詹太巨啦!!!我就想直接最小生成树之后建树跑dfs,然后写跪了...然后看小詹博客之后恍然大悟,原来直接把边权改为w * 2 + 两边点权值就行了. 但是还是不对,为什么呢?原来我们起点走了三遍,还要加上一次. 题干: Description Farmer John变得非常懒, 他不想再继续维护供奶牛之间供通行的道路. 道路被用来连接N ( <= N <= ,)个牧场, 牧场被连续地编号为1..N. 每一个牧场都是一个奶牛的家. FJ计划除去P(N- <= P <= ,)条…
问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性.你首先要决定那些道路是需要保留的N-1条道路.第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间.没有两个牧场是被一条以上的道路所连接.奶牛们非常伤心,因为她们的交通系…
Description 约翰有N个牧场,编号依次为1到N.每个牧场里住着一头奶牛.连接这些牧场的有P条 道路,每条道路都是双向的.第j条道路连接的是牧场Sj和Ej,通行需要Lj的时间.两牧场之 间最多只有一条道路.约翰打算在保持各牧场连通的情况下去掉尽量多的道路. 约翰知道,在道路被强拆后,奶牛会非常伤心,所以他计划拆除道路之后就去忽悠她们. 约翰可以选择从任意一个牧场出发开始他维稳工作.当他走访完所有的奶牛之后,还要回到 他的出发地.每次路过牧场i的时候,他必须花Ci的时间和奶牛交谈,即使之前…
题目描述 约翰有 N 头奶牛,第 i 头奶牛的编号是 S i ,每头奶牛的编号都不同.这些奶牛最近在闹脾气, 为表达不满的情绪,她们在排队的时候一定要排成混乱的队伍.如果一只队伍里所有位置相邻的奶牛 的编号之差都大于 K,那么这就是一只混乱的队伍,其中 K 是一个给定的整数.比如说,当 K = 2 时,序列 (1,3,5,2,6,4) 就是一支混乱的队伍,而 (1,3,6,5,2,4) 不是,因为 6 和 5 只差 1,不够混 乱.请问,这 N 头奶牛可以排成多少种混乱的队形呢? 输入 • 第一…
题目:http://hzwer.com/2493.html 分析:对于每条边,贡献的价值是这条边的边权加上这条边连接的两点的权值,所以可以把每条边的边权加上两顶点的点权作为新的边权,然后跑个最小生成树就行了,要注意作为树根的那个点还要再经过一次,所以找个点权最小的点作为树根,再加上这个树根的点权.…
记: 本题目考的是最小生成数,可使用Kruskal算法 第一次,20分 原因:使用动态数组,有概率报运行错误(大雾= =) 第二次,100分 原因:改用静态数组,一次过 示例代码: #include <stdio.h> #include <stdlib.h> #define INF 99999999 typedef struct node node_t; typedef struct node { int S; int E; int L; }node; node e[]; int…
可以發現每個點經過次數恰好等於這個點的度數,所以把點權下放邊權,跑最小生成樹,原來邊權乘二在加上兩端點權,答案再加一遍起點最小點權 #include<bits/stdc++.h> #define ll long long using namespace std; ; ; int n,m; ll ans; struct node{ int u,v,w,nxt; bool operator <(const node&a)const{ return w<a.w; } }e[max…
题意:给一个图 需要找到一个子图使得所有点都连通 然后再选择一个点做为起点 走到每个点并回到起点 每条边,每个点被经过一次就要花费一次边权.点权 题解:肯定是找一颗最小生成树嘛 然后惊奇的发现 任意选一个点做为一个起点遍历的答案都是 每条边走两次 每个点度数是多少点权就统计几次 依题意起点多统计一次 那么起点就选一个点权最小的点 然后把每条边两个端点的点权赋给它 跑一个最小生成树 还是挺有意思的 #include <bits/stdc++.h> using namespace std; ];…
先考虑边的代价,容易发现每一条边都需要走两次,也就是2*边权再考虑点的代价,由于上面的结论,那么就是度数*点权然后就可以构造新的边权为2*原边权+连接点的点权,然后求最小生成树即可注意根还有一个点权,所以再加上根(也就是最小点)的点权即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 10005 4 struct ji{ 5 int x,y,z; 6 }e[N*10]; 7 int n,m,ans,a[N],f[N];…