首页 > 其他分享 >一些做题记录

一些做题记录

时间:2024-08-11 09:27:31浏览次数:5  
标签:cnt return 记录 int cin 一些 define first

图论

P1993 小 K 的农场

复习差分约束QAQ。设农场 \(i\) 种植的作文有 \(x_i\) 个单位,则题目中的三个条件就是:

\[\begin{cases} x_a \ge x_b + c \\ x_a \le x_b + c \\ x_a = x_b \end{cases} \]

其中第一个不等式可以转化成

\[\begin{cases} x_b \le x_a - c \end{cases} \]

注意到最短路中对于任何节点 \(x\) ,都满足 \(dis_x \le dis_y + w_{y, x}\) ,所以我们只需要对于不等式一,从 \(a\) 向 \(b\) 连一条长度为 \(-c\) 的边,对于不等式二,从 \(b\) 向 \(a\) 连一条长度为 \(c\) 的边,对于不等式三,因为 \(a = b \Leftrightarrow a \le b\) 且 \(b \le a\) ,所以我们从 \(a\) 向 \(b\) 连一条长度为 \(0\) 的边,再从 \(b\) 向 \(a\) 连一条长度为 \(0\) 的边,最后跑一遍最短路即可。需要注意,有可能图中出现负环,判无解即可。

#include<bits/stdc++.h>
using namespace std;

#define N 6010
#define pii pair<int, int>

int n, m;
int vis[N], cnt[N], d[N];
vector<pii> e[N];

int spfa(int s){
  queue<pii> q;
  q.push({s, 0});
  memset(d, 0x3f, sizeof d);
  vis[s] = 1, d[s] = 0;
  while(!q.empty()){
    int u = q.front().first; q.pop();
    vis[u] = 0;
    for(auto v : e[u]){
      if(d[v.first] > d[u] + v.second){
        d[v.first] = d[u] + v.second;
        cnt[v.first] = cnt[u] + 1;
        if(cnt[v.first] >= 2 * n) return 0;
        if(!vis[v.first]){
          vis[v.first] = 1;
          q.push({v.first, d[v.first]});
        }
      }
    }
  }
  return 1;
}

signed main(){
//   freopen("sr.in", "r", stdin);
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  while(m--){
    int op, a, b, c;
    cin >> op >> a >> b;
    if(op == 1){
      cin >> c;
      e[a].push_back({b, -c});
    }
    else if(op == 2){
      cin >> c;
      e[b].push_back({a, c});
    }
    else{
      e[a].push_back({b, 0}), e[b].push_back({a, 0});
    }
  }
  for(int i = 1; i <= n; i ++){
    e[n + 1].push_back({i, 0});
  }
  if(spfa(n + 1)) cout << "Yes" << endl;
  else cout << "No" << endl;
  return 0;
}

P1195 口袋的天空

一眼最小生成树。但是题意仍然看了好久才看懂QAQ。就是给定 \(n\) 个点, \(m\) 条边,连成 \(k\) 个树的最小代价。容易想到 Kruskal,每一次建边将当前的连通块--,直到最后为 \(k\) 个即可。感觉Prim没什么应用场景啊

#include<bits/stdc++.h>
using namespace std;

#define N 1010
#define M 10010

int n, m, k;
int cnt, ans;
int fa[N];

struct EDGE{
  int a, b, w;
}e[M];

int find(int x){
  return fa[x] == x ? x : fa[x] = find(fa[x]);
}

int cmp(EDGE a, EDGE b){
  return a.w < b.w;
}

signed main(){
//   freopen("sr.in", "r", stdin);
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> m >> k;
  for(int i = 1; i <= m; i ++){
    int a, b, c;
    cin >> a >> b >> c;
    e[i] = {a, b, c};
  }
  for(int i = 1; i <= n; i ++){
    fa[i] = i;
  }
  cnt = n;
  sort(e + 1, e + m + 1, cmp);
  for(int i = 1; i <= m; i ++){
    int a = find(e[i].a), b = find(e[i].b);
    if(a == b) continue;
    cnt--;
    fa[a] = b;
    ans += e[i].w;
    if(cnt == k){
      cout << ans;
      return 0;
    }
  }
  cout << "No Answer";
  return 0;
}

P1550 [USACO08OCT] Watering Hole G

感觉很奇妙的一题。看似图中只有 \(n\) 个节点,实际上,完全可以将打井看作是向地下的某个隐藏节点连边。于是就加上这个节点跑最小生成树就好啦。

我才不会说我写Kruskal忘排序了呢

#include<bits/stdc++.h>
using namespace std;

#define N 310
#define M 100010

int n, m;
int cnt = 0;
int p[N];

struct EDGE{
  int a, b, w;
}e[M];

int find(int x){
  return p[x] == x ? x : p[x] = find(p[x]);
}

int cmp(EDGE a, EDGE b){
  return a.w < b.w;
}

void Kruskal(){
  sort(e + 1, e + cnt + 1, cmp);
  int ans = 0;
  for(int i = 1; i <= n + 1; i ++) p[i] = i;
  for(int i = 1; i <= cnt; i ++){
    int a = find(e[i].a), b = find(e[i].b);
    if(a == b) continue;
    ans += e[i].w;
    p[a] = b;
  }
  cout << ans;
}

signed main(){
  //freopen("sr.in", "r", stdin);
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n;
  for(int i = 1; i <= n; i ++){
    int w;
    cin >> w;
    e[++cnt] = {n + 1, i, w};
  }
  for(int i = 1; i <= n ;i ++){
    for(int j = 1; j <= n; j ++){
      int w;
      cin >> w;
      e[++cnt] = {i, j, w};
    }
  }
  Kruskal();
  return 0;
}

标签:cnt,return,记录,int,cin,一些,define,first
From: https://www.cnblogs.com/yduck/p/18353098

相关文章

  • Codeforces Round 965 (Div. 2) 补题记录(A,B,D,E1)
    speedforcesagain~A<E1<<B<D<<CA若\(k\equiv1(\bmod2)\),则构造\((x,y)\),\((x-1,y)\),\((x+1,y)\),\((x-2,y)\),\((x+2,y)\),\(\ldots\)。否则构造\((x-1,y)\),\((x+1,y)\),\((x-2,y)\),\((x+2,y)\),\(\ldots\)。#pra......
  • [考试记录] 2024.8.10 csp-s 模拟赛18
    80+20+0+70=170第三题应该有10分暴力的,但我没打。T1星际旅行题面翻译总共有n个节点,m条路径,要求其中m-2条路径走两遍,剩下2条路径仅走一遍,问不同的路径总数有多少,如果仅走一遍的两条边不同则将这两条路径视为不同。样例#1样例输入#15412131415样例输......
  • 一些结论
    Prufer序列Prufer序列可以将一个带标号 n 个节点的树用 [1,n]中的 n−2 个整数表示,即 n 个点的完全图的生成树与长度为 n−2 值域为 [1,n] 的数列构成的双射。Cayley定理节点个数为n的无根标号树的个数为nn-2扩展Cayley定理1n个标号节点形成一个有s颗树的......
  • 关于动态规划的一些理解
    关于动态规划的一些理解1.什么是动态规划动态规划(DP,DynamicProgramming)是一种解决问题的方法。它通过将难以实现的整体的大问题划分成简单的局部的小问题。最后将小问题一一求解以完成问题。对于动态规划能否使用有一些限制,这些限制我推荐参看动态规划基础-OIWiki中的描述......
  • 记录5:ESP32S3的usb使用
    0、前期准备1、会使用idf开发环境2、懂得kconfig1、知识储备1.1概述​TingUSB是一个开源的跨平台的USB主机/设备的usb协议栈,常用在mcu开发平台,由于不采用动态分配内存以及阻塞所有中断事件,将中断事件要处理的事情都放在,非中断函数中处理,因此该usb栈内存设计非常安全......
  • 记录3:ESP32-C3的串口使用
    0、前期准备1、参考首篇文章搭建好esp32环境2、准备好一块esp32开发开发板(本作者使用了esp32c3作为开发平台)1、知识储备1.1概述​UART称为通用异步收发器,可以进行全双工/半双工数据通讯数据通讯,通讯距离取决于上拉驱动能力、波特率,一般只在电路板上使用,如果需要长距......
  • 一些面试小tips
    反射它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。反射可以让代码更加灵活、(为各种框架提供开箱即用的功能提供了便利),一般我们写业务代码接触到直接使用反射机制的场景不多,但是在Spring/Sprin......
  • 002.Vue3入门,使用模板语法的一些高级功能
    1、代码如下:<template><h3>模板语法</h3><p>{{msg}}</p><p>{{msg_cn}}</p><p>{{number+1}}</p><p>{{ok?'Yes':'No'}}</p><p>{{message.split("......
  • 大一暑假学习记录6
    这一周我基本完成了刘立嘉老师布置的暑假作业,其中通讯录的录入与显示,整数分解为若干项之和是我认为最难做的题目,前者的难点是sample有查询越界、最大N,反复查询同一记录等等。后者则是样例等价,多行输出难以解决。于是我又重新学习了结构体部分的内容,定义了Contact结构体来存储......
  • Java学习记录第六周
    今天在进行数组反转时第一次用了这个代码![](https://img2024.cnblogs.com/blog/3475598/202408/3475598-20240808230516048-1627660110.png)没有考虑到第一个循环只进行一次时,第二个循环进行完一轮了。第二次用了这个代码没有考虑到数组直接赋值会使原先的值丢失,所以最后又定......