首页 > 其他分享 >2023-09-05 图论专项训练(五)

2023-09-05 图论专项训练(五)

时间:2023-09-09 16:11:11浏览次数:37  
标签:const 05 int sum 09 40 链表 2023 include

我TM但凡有点水平也不至于一点水平没有吧。——每日感想

T1

距离/P4162 [SCOI2009] 最长距离
这道题本质上是一道十分弱智的搜索题,无论是开DFS还是开BFS还是开BDFS都能做。本人在这里不建议使用使用deque进行BFS,理由是运行速度比较慢,稍有不慎就见祖宗了。
我在这里使用DFS,但是纯净的DFS直接用估计不大行(自己算算,你就知道为啥不大行了)。所以我们加上大记忆恢复术记忆化和剪枝。就可以过掉该题目了。

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};
int n,m,t,t;
int ans;
int dis[40][40],a[40][40];
void dfs(int x,int y,int sum){
    if(sum>T){
    	return ;
	}
    if(sum>=dis[x][y]){
    	return ;
	}
    dis[x][y]=sum;
    for(int i=0;i<4;i++){
        int xx=x+dx[i];
        int yy=y+dy[i];
        if(xx<1||yy<1||xx>n||yy>m){
        	continue;
		}       
        dfs(xx,yy,sum+a[xx][yy]);
    }
}
int main(){
    cin>>n>>m>>t;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            char c;
            cin>>c;
            a[i][j]=c-'0';
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            memset(dis,INF,sizeof(dis));
            if(a[i][j]==1)
            dfs(i,j,1);
            else dfs(i,j,0);
            for(int x=1;x<=n;x++){
                for(int y=1;y<=m;y++){
                    if(dis[x][y]<=t){
                        ans=max(ans,((i-x)*(i-x)+(j-y)*(j-y)));
                    }
                }
            }
        }
    }
    printf("%.6lf",sqrt(ans));
    return 0;
}

T2

交通/P1346 电车

这个题需要用到我们的神奇海螺分层图大法,像我一样不会分层图的右转去bdfs一下

题目中给出的只有两种状态:横边和纵边。我们建立两层图,第一层只存储横边,第二层只存储纵边。

显然,只需要在相邻两个换乘站(即可以转向的交汇站)之间建立双向边。否则走到其他站点就再也回不了家了。

于是,在每一层内,我们分别以换乘站的横坐标或纵坐标为第一关键字排序,那样就省去了一个换乘站和其他所有都建边的操作,只需在相邻两个之间建边即可,并且不影响图的连通性。

之后考虑层与层之间建边。如果要从一层转到另一层(相当于转向操作),需要1单位时间。那么就将每层中的相同节点之间建立一条边权为一的边。特别地,起点和终点要建立边权为0的边。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=100+10;
const int inf=1e+8;
int g[maxn][maxn];
int n,m,k,f,t;
int main()
{
    scanf("%d%d%d",&n,&f,&t);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {g[i][j]=inf;g[i][i]=0;} 
    for(int i=1;i<=n;i++){
    scanf("%d",&k);
    for(int j=1;j<=k;j++){
    int a;
    scanf("%d",&a);
    if(j==1)g[i][a]=0;
    else g[i][a]=1;
    }
    }
    for(int k=1;k<=n;k++)
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
    if(g[f][t]==inf)puts("-1");
    else printf("%d",g[f][t]);
}

T3

鸽了

T4

微信/P3452 [POI2007] BIU-Offices

想要做对这道题,学好语文很重要(?)。本题目的特殊限制是不在同一个牛圈里的牛必须是微信好友,但是他说在同一个牛圈里的牛一定不是了吗?没说!所以那些语文不好读不懂题的人就寄了。
然后考虑一下一些方法:
1、暴力
这个题吧,一次性存入所有的边然后暴力地去走,我没说不可以,只是你看看这个: $ 2≤N≤10^5 $,如果暴力能过那么有且仅有两种可能:数据太水,或者你这测评机是太湖一号(或者别的什么)。
这一条知道了,下一个。
2、 跑SPFA
我就只能说:spfa……额……但愿他和pause玩得开心。
3、正解

你猜

其实这道题方法很多,只是个人倾向的问题。本人更倾向链表队列的方法

  1. 将所有的点加入链表
  2. 从链表中随便拿出一个点加入队列,如果链表为空,结束
  3. 遍历队列
    • 对于当前点,把该点的连接的边打标记。
    • 遍历链表,取出没有打标记的点从链表中删去并加入队列。
    • 取消标记。
  4. 在3中进入队列的点统计为一个连通块
/、不是本人代码,凑合着看吧
#include <cstdio>
#include <algorithm>
const int N=1e5+10;
const int M=2e6+10;
int head[N],to[M<<1],Next[M<<1],cnt;
void add(int u,int v)
{
    to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
int n,m,pre[N],suc[N],q[N],l,r,ans[N],col[N],tot;
int main()
{
    scanf("%d%d",&n,&m);
    for(int u,v,i=1;i<=m;i++)
        scanf("%d%d",&u,&v),add(u,v),add(v,u);
    for(int i=1;i<=n;i++)
        pre[i]=i-1,suc[i]=i+1;
    suc[0]=1,suc[n]=0;
    while(suc[0])
    {
        l=1,r=0;
        q[++r]=suc[0];
        suc[0]=suc[suc[0]];
        pre[suc[q[r]]]=0;
        while(l<=r)
        {
            int now=q[l++];
            for(int i=head[now];i;i=Next[i])
                col[to[i]]=1;
            int cur=suc[0];
            while(cur)
            {
                if(!col[cur])
                {
                    q[++r]=cur;
                    pre[suc[cur]]=pre[cur];
                    suc[pre[cur]]=suc[cur];
                }
                cur=suc[cur];
            }
            for(int i=head[now];i;i=Next[i])
                col[to[i]]=0;
        }
        ans[++tot]=l-1;
    }
    std::sort(ans+1,ans+1+tot);
    printf("%d\n",tot);
    for(int i=1;i<=tot;i++) printf("%d ",ans[i]);
    return 0;

标签:const,05,int,sum,09,40,链表,2023,include
From: https://www.cnblogs.com/tlbw-working-room/p/17682952.html

相关文章

  • 2023版标准地图
    水系名称字号规范按自然形状、走向注出、依其面积大小和长度选择字号,但江、河上游和支流的名称字号,不能超过下游和主流的名称字号,另外,名称一般注在河=流、湖泊的内部,当内部不能容纳时,可注在外侧地面河流a代表岸线,b代表高水位岸线湖泊有名称的应加注名称湖泊水是咸水(矿化......
  • SMU Autumn 2023 Round 1(Div.1)
    SMUAutumn2023Round1(Div.1)A.SetorDecrease(枚举)题意就是你可以进行两种操作,将\(a_i-1\)或者令\(a_i\)等于\(a_j\),然后使得\(\sum\limits_{i=1}^{n}a_i\leqk\),求最少的操作步数首先我们让一个大数变成一个最小数的贡献肯定是要比让大数减一产生的贡献更多,所以我......
  • SY2023CTF--“安洵杯”全国精英赛MISC--烦人的压缩包
    前言:由于最近要比第二届技能大赛CTF就玩的少(我很菜,求大佬带)随便看看做了一题那个数独也简单不敢兴趣就run了烦人的压缩包:首先下载下来一个压缩包需要密码直接爆破一下使用工具:Ziperello得到密码:645321解压打开得到两个文件hint.txt和love.jpg放入010Editor发现是有......
  • 20211325 2023-2024-1 《信息安全系统设计与实现(上)》第一周学习笔记
    202113252023-2024-1《信息安全系统设计与实现(上)》第一周学习笔记一、任务要求任务详情自学教材第1,2章,提交学习笔记(10分),评分标准如下1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)......
  • 2023-09-09 微信小程序之引入uni_modules过多插件导致主包体积过大如何解决 ==》hbuil
    前言:uni_modules里面的插件会全部打包在主包里,分包如果都是引用了uni_modules的插件,那么会导致包体积越来越大。我的项目主要用到一些组件库,如uview,对这个库的依赖太严重了,加上是把2个小程序融合到一起,所以对这个库的依赖就会变得更多。解决方案:你的小程序是用uniapp开发,才能使......
  • 地球第三极亮相2023中国服贸会 西藏极净特产登上世界舞台
    来源:珠峰云APP9月2日,2023年中国国际服务贸易交易会(以下简称“服贸会”)在北京正式拉开帷幕。地球第三极以西藏自治区区域公共品牌形象亮相,为全球展商带去众多西藏极净特产,让世界看见西藏好品质。据悉,本届服贸会以“开放引领发展,合作共赢未来”为主题,于9月2日至6日在国家会议......
  • solidworks 2023 SP3.0 安装笔记
    参考文献:Crack自带readme.txthttps://mp.weixin.qq.com/s?__biz=Mzk0NjI3ODE4OQ==&mid=2247592805&idx=1&sn=a8af2a6130ebb82972d2e09df555a90b&chksm=c30bb127f47c3831e9a82129098132c06ba8d083f8cbe0085a293874efdd20ff92434d8d1fcc&scene=21#wechat_redir......
  • 【230909-3】椭圆:x^2/200^2+y^2/150^2=1 的图像及特征
    【图像】【代码】<!DOCTYPEhtml><htmllang="utf-8"><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><head><title>椭圆:x^2/200^2+y^2/150^2=1</title><styletype=&quo......
  • Blender官方版下载-Blender下载安装2023最新版 新功能介绍
    Blender中文版是一款非常好用的三维绘画和渲染软件,软件的兼容性非常的强大,可以支持很多不同系统平台的操作,而且软件的大小也不会占据太多的内存,可以在很多不同的平台上使用。软件地址:看置顶贴基本简介Blender是一款免费的开源3D创作套件。它支持整个3D管道建模,装配,动画,模拟,渲染,合成......
  • 05-el与data的两种写法
    el与data的两种写法el的两种写法1)创建Vue实例对象的时候配置el属性2) 先创建Vue实例,随后再通过v.$mount('#root)指定el的值//el的两种写法constv=newVue({//el第一种写法//el:"#root",data:{name:"马铃薯"}})//el第......