bzoj1202: [HNOI2005]狡猾的商人(差分约束)

1202: [HNOI2005]狡猾的商人

题目:传送门

题解:
   据说是带权并查集!蒟蒻不会啊!!!

   可是听说lxj大佬用差分约束A了,于是开始一通乱搞。

   设s[i]为前i个月的总收益,那么很容易就可以推出约束条件了啊:

   s[x-1]>=s[y]-c s[y]>=s[x-1]+c

   然后就可以去跑最长路了

   吐槽:

   lxj大佬推出来的条件竟然是两个小于等于号:s[x-1]<=s[y]-c s[y]<=s[x-1]+c

   然后跑最短路也A了,表示很玄学qwq

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 int T;
 8 struct tj
 9 {
10     int x,y,d;
11 }b[2100];
12 struct node
13 {
14     int x,y,d,next;
15 }a[2100];int len,last[2100];
16 int s[2100],d[2100];
17 void ins(int x,int y,int d)
18 {
19     len++;a[len].x=x;a[len].y=y;a[len].d=d;
20     a[len].next=last[x];last[x]=len;
21 }
22 bool v[2100];int ru[2100],list[2100];
23 int main()
24 {
25     scanf("%d",&T);
26     while(T--)
27     {
28         memset(s,0,sizeof(0));
29         int n,m;scanf("%d%d",&n,&m);
30         len=0;memset(last,0,sizeof(last));
31         for(int i=1;i<=m;i++)
32         {
33             int x,y,d;
34             scanf("%d%d%d",&x,&y,&d);
35             ins(y,x-1,-d);ins(x-1,y,d);
36         }
37         /*
38             s[x-1]>=s[y]-c s[y]>=s[x-1]+c
39         */
40         for(int i=1;i<=n;i++)d[i]=-999999999;
41         int head=0;for(int i=n;i>=0;i--)list[++head]=i;
42         memset(v,0,sizeof(v));memset(ru,0,sizeof(ru));
43         bool bk=true;
44         while(head!=0)
45         {
46             int x=list[head--];v[x]=true;
47             for(int k=last[x];k;k=a[k].next)
48             {
49                 int y=a[k].y;
50                 if(d[y]<d[x]+a[k].d)
51                 {
52                     d[y]=d[x]+a[k].d;
53                     ru[y]++;if(ru[y]==n+1){bk=false;break;}
54                     if(v[y]==true)v[y]=false,list[++head]=y;
55                 }
56             }
57              if(bk==false)break;
58         }
59         if(bk==false)printf("false\n");
60         else printf("true\n");
61     }
62     return 0;
63 }

原文地址:https://www.cnblogs.com/CHerish_OI/p/8496148.html

时间: 2024-10-17 11:20:18

bzoj1202: [HNOI2005]狡猾的商人(差分约束)的相关文章

BZOJ 1202: [HNOI2005]狡猾的商人( 差分约束 )

好像很多人用并查集写的... 前缀和, 则 sumt - sums-1 = v, 拆成2条 : sumt ≤ sums-1 + v, sums-1 ≤ sumt - v 就是一个差分约束, 建图跑SPFA.. 想起之前codeVS某场月赛T1有些人用带权并查集..然而我是差分约束水过去的... ------------------------------------------------------------------------------ #include<cstdio> #incl

bzoj1202: [HNOI2005]狡猾的商人(并查集 差分约束)

1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4127  Solved: 1981[Submit][Status][Discuss] Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 Ai大于0时表示这个月盈利Ai 元,当 Ai小于0时表示这个月亏损Ai

BZOJ1202 [HNOI2005]狡猾的商人 并查集维护前缀和

1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1935  Solved: 936[Submit][Status][Discuss] Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 Ai大于0时表示这个月盈利Ai 元,当 Ai小于0时表示这个月亏损Ai 元

bzoj1202 [HNOI2005]狡猾的商人

题目链接 并查集 听说有人用差分约束做,我哪天也去试一试 并查集维护后缀和,从前往后合并 注意路径压缩的时候要修改后缀和 1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 #include<string> 7 #include<cmath> 8 #include<

[BZOJ1202][HNOI2005]狡猾的商人(并查集+前缀和)

题目描述 传送门 题解 刚开始感觉只有几个区间和另外几个区间都拼成了同一个区间的时候才有可能判false,然后xjblg写出了一个对拍都不过的code然后交上去A了= =可见数据之弱. 网上的正解是并查集,YY了挺久的. 读入区间(l,r,w),如果l和r不在一个集合里,将它们合并:否则判断dis_r-dis_x是否等于w(其中dis_i表示i到它祖先的距离) 代码 xjblg #include<algorithm> #include<iostream> #include<c

洛谷P2294 [HNOI2005]狡猾的商人 ,神奇做法——贪心

HNOI2005狡猾的商人,洛谷链接 原题入口 看到大牛都是写的差分约束或带权并查集,本蒟蒻都不太会(还是用差分约束过了的QAQ),但是想出一种贪心的策略,运用神奇的优先队列实现.思路是:先按左端点为第一排序关键字,再排右端点.之后就开始两两比较,如果左端点相等,就比较右端点,如果相等,就比较值,如果值不同,就直接输出false,否则输出true,如果右端点不等,就把相同的部分抵消掉,把新的区间再压入优先队列.直到不能操作,就输出true.下附代码: 1 #include<queue> 2 #

[HNOI2005]狡猾的商人 ,神奇做法——贪心

洛谷P2294 [HNOI2005]狡猾的商人 ,神奇做法--贪心 看到大牛都是写的差分约束或带权并查集,本蒟蒻都不太会(还是用差分约束过了的QAQ),但是想出一种贪心的策略,运用神奇的优先队列实现. 思路是:先按左端点为第一排序关键字,再排右端点.之后就开始两两比较,如果左端点相等,就比较右端点,如果相等,就比较值,如果值不同,就直接输出false,否则输出true,如果右端点不等,就把相同的部分抵消掉,把新的区间再压入优先队列.直到不能操作,就输出true. 下附代码: #include<q

1202: [HNOI2005]狡猾的商人

1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1554  Solved: 745[Submit][Status] Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 Ai大于0时表示这个月盈利Ai 元,当 Ai小于0时表示这个月亏损Ai 元.所谓一段时间内的

bzoj 1202: [HNOI2005]狡猾的商人 并查集好题

1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2946  Solved: 1384[Submit][Status][Discuss] Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 Ai大于0时表示这个月盈利Ai 元,当 Ai小于0时表示这个月亏损Ai