刷题刷题。

news/2024/11/29 9:58:29/

租用游艇 

 

1.格式化输入二维数组:1-2,1-3,1-4,2-3,2-4,3-4... ...

                                       for(int i=1; i<=n-1; i++)
                                             for(int j=i+1; j<=n; j++)

2.三重for循环枚举路径:第一层for枚举1-k中转站,第二,三层为 i站点--j站点直达所需距离

3.输出1-n(a[1][n])的最短路径:有序!1-n ≠ n-1

#include<stdio.h>
#include<string.h>
int main()
{int n,a[210][210];scanf("%d",&n);memset(a,1,sizeof(a));                //数组初值赋大数for(int i=1; i<=n-1; i++)                  //注意输入格式 {for(int j=i+1; j<=n; j++) {scanf("%d",&a[i][j]);}}for(int k=1; k<=n; k++)               //枚举1-k中转站{for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){if(a[i][j]>a[i][k]+a[k][j]){a[i][j]=a[i][k]+a[k][j];}}}}printf("%d",a[1][n]);               //1-n的最短路径
}

  修路

 

 

 

1.变量设置:结构体存储:点1+点2+1到2的距离

2.初始化&&找find father:并查集基本操作

3.升序排序距离:调用库函数,快排不行

4.unionn时加入权值(距离):

5.终止条件:sum==n-1,线全部用完

6.注意:条件已知已连接点点,两点距离设为0即可

#include<bits/stdc++.h>
using namespace std;
int fa[500501];
long double ans=0.0;
int sum=0;
int k=0;struct node
{int x,y;double z;
} a[500501];void init(int n)
{for(int i=1; i<=n; i++){fa[i]=i;}
}int find(int i)
{if(fa[i]==i) return i;else{return find(fa[i]);}
}bool cmp(node a,node b)
{return a.z<b.z;
}void add(int i,int j,double l)        //构造结构体存储两点间距离(点+点+距离) 
{a[++k].x=i;a[k].y=j;a[k].z=l;
}int main()
{int i,j,m,n,b,c;int xx[500501],yy[500501];scanf("%d %d",&n,&m);init(n);for(i=1; i<=n; i++){scanf("%d %d",&xx[i],&yy[i]);}for(i=1; i<=n; i++)for(j=i+1; j<=n; j++){long double z=(double)sqrt((double)(xx[i]-xx[j])*(xx[i]-xx[j])+(double)(yy[i]-yy[j])*(yy[i]-yy[j]));add(i,j,z);}for(i=1; i<=m; i++){scanf("%d %d",&b,&c);add(b,c,0.0);}//quick(1,k);sort(a+1,a+1+k,cmp); for(i=1; i<=k; i++){int x=find(a[i].x);int y=find(a[i].y);if(x!=y){fa[x]=y;sum++;                    //线使用量+1 ans+=a[i].z;             //权值求和 }if(sum==n-1) break;         //n为点个数,n-1为线个数 }printf("%.2Lf",ans);return 0; 
}

最小生成树 

 

1.利用快排对边长短排序:从最小边开始连接
2.连接点点(集合):unionn并查集,fa相同continue,不同则合并,同时加上权值

3.查找是否连通:即为察father是否唯一

4.注意:并查集标准操作,初始化+找find father+合并

#include<stdio.h>
int n,m;
int fa[210000];
long long ans=0;
int cnt=0;struct node
{int x,y,z;
} a[210000];void quick(int left,int right)
{int i,j;         //双指针i,jstruct node t,temp; //最左边为基准数,每次递归过程数会变化temp=a[left];                        //结构体t,temp(需整体交换,排序过程)i=left;                       //同理,变化数利用变量代用j=right;if(left>right) return ;while(i!=j){while(a[j].z>=temp.z&&i<j)j--;while(a[i].z<=temp.z&&i<j)i++;if(i<j)            //i,j没有相遇时{t=a[i];        //整体交换a[i]=a[j];a[j]=t;}}a[left]=a[i];        //将i,j相遇的值给队首a[i]=temp;           //此时基准数位于相遇点quick(left,i-1);quick(j+1,right);
}void init(int n)              //fa[]初始化
{for(int i=1; i<=n; i++){fa[i]=i;}
}int find(int i)             //查询,找爸爸
{if(i==fa[i]) return i;else{fa[i]=find(fa[i]);return fa[i];}
}int main()
{scanf("%d %d",&n,&m);for(int i=1; i<=m; i++){scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].z);}init(m);              //初始化fa[]quick(1,m);//升序排序,找最小边for(int i=1; i<=m; i++)     //集合{int x=find(a[i].x);int y=find(a[i].y);if(x==y) continue;else{fa[x]=y;ans+=a[i].z;}}for(int i=1; i<=n; i++){if(fa[i]==i){cnt++;            //找cnt个集合}}if(cnt>1) printf("orz\n");    //只能有一个集合else printf("%lld\n",ans);return 0;}

 


http://www.ppmy.cn/news/58474.html

相关文章

普通人职场自我反省十条

1. 你是否在公司里是足够优秀&#xff0c;这种优秀已经成为公司不可或缺的一部分。 如果你做不到这点&#xff0c;那你的价值就会很低。你觉得如果你雇一个员工&#xff0c;他做不到非常优秀且不可或缺&#xff0c;你会在意他的想法&#xff0c;在意他的生死吗&#xff1f;如果…

第二十八章 Unity射线检测

本章节我们介绍一下射线。射线就是从一个固定点向一个方向发射出一条直线&#xff0c;在发射过程中需要判断该射线有没有与游戏物体发送碰撞。射线既可以用来检测射击游戏中武器指向目标&#xff1b;又可以判断鼠标是否指向游戏物体。射线的创建方式&#xff0c;一般使用代码来…

python开发构建基于CNN的人脸识别系统

卷积神经网络在图像处理领域中早就是独树一帜的存在&#xff0c;今天正好有时间就想着基于CNN开发构建一个人脸识别系统&#xff0c;首先看下效果图&#xff1a; 数据集来源于LFW数据集&#xff0c;简单看下本文使用的小批量的数据集如下&#xff1a; 一共有12个人的图像数据&a…

linux命令之iostat详解

iostat 监视系统输入输出设备和CPU的使用情况 推荐Linux命令在线工具&#xff1a;linux在线查询工具 补充说明 iostat命令 被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况&#xff0c;同时也会汇报出CPU使用情况。同vmstat一样&#xff0c;ios…

Spring Boot比Spring多哪些注解?

Spring Boot是建立在 Spring 框架之上的&#xff0c;它的目标是简化 Spring 应用程序的开发和部署。Spring Boot 通过自动配置和约定优于配置的原则&#xff0c;大大简化了 Spring 应用程序的配置和开发过程。 尽管Spring Boot使用了很多Spring的核心功能和注解&#xff0c;但…

(1)QT基础铺垫

目录 1.Qt特性 2. 新建项目 3. 工作目录与构建目录 4. 工作目录 4.1 .pro 项目配置文件 4.2 dialog.h 4.3 dialog.cpp 4.4 main.cpp 5. 帮助文档 6. 调试信息 1.Qt特性 Qt经常被当作是一个基于c语言的gui开发框架&#xff0c;但是这并不是qt的全部&#xff0c;除了开…

微服务知识2

CAP和BASE是分布式必备理论基础 CAP理论 一致性(C)&#xff1a;写操作之后进行读操作无论在哪个节点都需要返回写操作的值 可用性(A)&#xff1a;非故障的节点在合理的时间内返回合理的响应 分区容错性(P)&#xff1a;当出现网络分区后&#xff0c;系统能够继续工作&#x…

【C++】实现两个线程交替打印1-100

文章目录 实现两个线程交替打印1-100 实现两个线程交替打印1-100 尝试用两个线程交替打印1-100的数字,要求一个线程打印奇数,另一个线程打印偶数 该题目主要考察的就是线程的同步和互斥: 互斥&#xff1a;两个线程都在向控制台打印数据,为了保证两个线程的打印数据不会相互影响…