luogu 2294 狡猾的商人 带权并查集
此题做法多啊
带权并查集,区间dp,前缀和,差分约束
1.自己写的前缀和, 11
#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std;
const int N=;
inline int read(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+(ch^);ch=getchar();}
return x*f;}
int T,n,m,l,r,v,sum,s[N];
int main(){
T=read();
while(T--){
int fg=;
n=read();m=read();
rep(i,,m){
l=read();r=read();v=read();
sum=s[r]-s[l-];
if(sum==) s[r]=s[l-]+v;
else if(sum&&sum!=v){printf("false\n");fg=;break;}}
if(fg) printf("true\n");
}return ;
}
2.自己写的区间dp
#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std; inline int read(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+(ch^);ch=getchar();}
return x*f;}
const int N=;
int T,n,m,x,y,z,p,f[N][N];
int main(){
T=read();
while(T--){
n=read();m=read();
rep(i,,m){
x=read();y=read();z=read();
f[x][y]=z;}
p=;
for(int i=;i<n;i++)if(p)
for(int j=i+;j<=n;j++)if(p)
for(int k=i;k<j;k++)if(p)
if(f[i][k]&&f[k+][j])
if(f[i][j]&&f[i][j]!=f[i][k]+f[k+][j]){
p=;break;}
else f[i][j]=f[i][k]+f[k][j];
if(p==) printf("false\n");
else printf("true\n");
}return ;
}
3.区间dp 100
注意枚举时的方向,此题第二层为逆序(没有明白啊啊啊)
#include<bits/stdc++.h>
using namespace std; inline int read(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+(ch^);ch=getchar();}
return x*f;}
const int N=;
int f[N][N],w,n,m,p,s,t,v;
int main(){
w=read();
while(w--){
memset(f,,sizeof(f));
n=read(),m=read();
for(int i=;i<=m;i++){
s=read(),t=read(),v=read();
f[s][t]=v;}
p=;
for(int i=;i<=n;i++)if(p)
for(int j=i-;j>=;j--)if(p)
for(int k=j;k<i;k++)
if(f[j][k]&&f[k+][i]){
if(f[j][i]&&f[j][i]!=f[j][k]+f[k+][i])
{p=;break;}
else f[j][i]=f[j][k]+f[k+][i];}
if(p==) printf("false\n");
else printf("true\n");
}
return ;
}
4.带权并查集
Attention!!!!!
f,ff提前取出来,不明原因,惨痛的教训。。。问提交满了一整页是怎样的感受
#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
#define dec(i,x,y) for(register int i=x;i>=y;i--)
#define int long long
using namespace std;
const int N=;
inline int read(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+(ch^);ch=getchar();}
return x*f;}
int T,n,m,x,y,z,fg,xx,yy,fa[N],cha[N];
int find(int x){
if(fa[x]==x) return x;
int f=fa[x],ff=find(fa[x]);cha[x]+=cha[f];
//先推直接父亲权值,再路径压缩
fa[x]=ff;return ff;
}
signed main(){
T=read();
while(T--){
fg=;n=read();m=read();
rep(i,,n) fa[i]=i,cha[i]=;
rep(i,,m){
x=read();y=read();z=read();x--;
xx=find(x),yy=find(y);
if(xx!=yy){
fa[yy]=xx,cha[yy]=cha[x]+z-cha[y];}
//此处 y连接在x 的子树上,y的深度大
else
if(cha[y]-cha[x]!=z) fg=;
}if(fg) printf("true\n");else printf("false\n");
}
}
5.差分约束+spfa判断(实在不想写这道题了啊啊啊)
#include <cstdio>
#include <vector>
using namespace std; const int maxn = ;
const int maxm = ; struct node{
int to, val;
};
vector<node> e[maxn];
int t, n, m, dis[maxn];
bool vis[maxn], flag; void SPFA(int x){ \\其实就是 DFS
vis[x] = ;
for(int i = ; i < e[x].size(); i++){
node v = e[x][i];
if(dis[v.to] > dis[x] + v.val){
if(vis[v.to]){flag = ; return;}
dis[v.to] = dis[x] + v.val;
SPFA(v.to);
}
}
vis[x] = ;
return;
}
int main(){
scanf("%d", &t);
while(t--){
scanf("%d%d", &n, &m);
for(int i = ; i <= m; i++){
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
e[u-].push_back((node){v, w});
e[v].push_back((node){u-, -*w}); //建图
}
for(int i = ; i <= n; i++){
dis[i] = ;
SPFA(i);
if(flag) { break;}
}
if(flag) printf("false\n");
else printf("true\n");
for(int i = ; i <= n; i++){ \\记得在判断完每一组之后复位
vis[i] = ;
dis[i] = ;
e[i].clear();
}
flag = ;
}
return ;
}
luogu 2294 狡猾的商人 带权并查集的更多相关文章
- 【bzoj1202】[HNOI2005]狡猾的商人 带权并查集
题目描述 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 Ai大于0时表 ...
- BZOJ 1202: [HNOI2005]狡猾的商人 [带权并查集]
题意: 给出m个区间和,询问是否有区间和和之前给出的矛盾 NOIp之前做过hdu3038..... 带权并查集维护到根的权值和,向左合并 #include <iostream> #incl ...
- BZOJ 1202 狡猾的商人(带权并查集)
给出了l,r,w.我们就得知了s[r]-s[l-1]=w.也就是说,点l-1和点r的距离为w. 于是可以使用带权并查集,定义dis[i]表示点i到根节点的距离.查询和合并的时候维护一下就OK了. 如果 ...
- BZOJ1202: [HNOI2005]狡猾的商人(带权并查集)
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4577 Solved: 2249[Submit][Status][Discuss] Descript ...
- BZOJ 1202 狡猾的商人 差分约束or带权并查集
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1202 题目大意: 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的 ...
- Bzoj1202/洛谷P2294 [HNOI2005]狡猾的商人(带权并查集/差分约束系统)
题面 Bzoj 洛谷 题解 考虑带权并查集,设\(f[i]\)表示\(i\)的父亲(\(\forall f[i]<i\)),\(sum[i]\)表示\(\sum\limits_{j=fa[i]} ...
- 【bzoj 1202】[HNOI2005] 狡猾的商人(图论--带权并查集+前缀和)
题意:一个账本记录了N个月以来的收入情况,现在有一个侦探员不同时间偷看到M段时间内的总收入,问这个账本是否为假账. 解法:带权并查集+前缀和. 判断账本真假是通过之前可算到的答案与当前读入的值是否 ...
- luogu 1196 银河英雄传说 带权并查集
带权并查集,其实有点像许多队列问情况的小学奥数 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<= ...
- 【poj 1182】食物链(图论--带权并查集)
题意:有3种动物A.B.C,形成一个"A吃B, B吃C,C吃A "的食物链.有一个人对N只这3类的动物有M种说法:第一种说法是"1 X Y",表示X和Y是同类. ...
随机推荐
- ARIMA模型识别、计算p、q值
#-*- coding: utf-8 -*- #确定最佳p.d.q值 import pandas as pd #参数初始化 discfile = '../data/discdata_processed ...
- Essential Phone PH1官方刷机方法
Essential Phone官方有两种包 一种是ota包,即sideload线刷使用的包.但此刷机方法只能ota升级,不能降级. 另一种是Images包,即fastboot线刷使用的包.这种方法可以 ...
- 近端梯度算法(Proximal Gradient Descent)
L1正则化是一种常用的获取稀疏解的手段,同时L1范数也是L0范数的松弛范数.求解L1正则化问题最常用的手段就是通过加速近端梯度算法来实现的. 考虑一个这样的问题: minx f(x)+λg(x) x ...
- Cuba获取属性文件中的配置
最直接的办法是,使用AppContext.getProperty("cuba.trustedClientPassword"); 可以获取到系统中的web模块下的wep-app.pr ...
- day24 包
# 把解决一类问题的模块会被放在一个文件夹里面,即包 # import os # os.makedirs('glance/api') # os.makedirs('glance/cmd') # os. ...
- MT【28】内心外衣下的等腰三角形个数
解答:30 评:这道题倒不是传统的与内心相关的向量题,传统的与内心或者内切圆有关的两个结论是aIA+bIB+cIC=0以及所谓的"人品公式"S=rp.这里主要是得到此三角形为以AC ...
- 【刷题】AtCoder Regular Contest 001
A.センター採点 题意:给一个只包含1.2.3.4的字符串,求出现次数最多和最少的字符 做法:还能怎么做... #include<bits/stdc++.h> #define ui uns ...
- python常见面试题(三)
问题1 到底什么是Python?你可以在回答中与其他技术进行对比(也鼓励这样做). 答案 下面是一些关键点: Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,Python代码在运行 ...
- 洛谷 P2292 [HNOI2004] L语言 解题报告
P2292 [HNOI2004] L语言 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章\(T\)是由若干小写字母构成.一个单词 ...
- 11:SSM框架下各个层的解释说明
具体见网址:http://blog.csdn.net/lutianfeiml/article/details/51864160