吉林大学23级数据结构上机实验(第7周)

A 去火车站

寒假到了,小明准备坐火车回老家,现在他从学校出发去火车站,CC市去火车站有两种方式:轻轨和公交车。小明为了省钱,准备主要以乘坐公交为主。CC市还有一项优惠政策,持学生证可以免费乘坐一站轻轨(但只能乘坐一站)。小明想尽快到达火车站,请编写程序为小明找到一条从学校到火车站最快的路线及换乘轻轨的方案。

假设换乘时间忽略不计,公交车与轻轨站点相同,但线路和速度不一定相同,所有线路都是双向的。可以第一站就乘坐轻轨,也可以最后一站乘坐轻轨,也可以在中间某站坐轻轨。如果乘坐轻轨和不乘坐轻轨到达火车站的时间相同,则无需换乘轻轨。最多坐一站轻轨。

输入格式:

输入包含多组数据。每组数据第一行为3个整数n、s和t,分别表示车站数(编号为1至n),小明学校所在的站和火车站所在的站。下一行为一个整数m,表示公交车的线路信息,接下来m行,每行为3个正整数a、b、c,表示公交车从a站到b站需要c分钟。下一行为一个整数k,表示轻轨的线路信息,接下来k行,每行为3个正整数x、y、z,表示轻轨从x站到y站需要z分钟。所有整数均不超过20000。

输出格式:

对每组数据输出2行。第1行为1个整数T,表示从学校到达火车站的最短时间;第2行为一个整数K,表示在站点K换乘轻轨,若有多个可能的换乘点,则输出编号最小者,如果无需换乘轻轨,则第二行输出“no metro”。

输入样例:

4 1 4
4
1 2 2
1 3 3
2 4 4
3 4 5
1
2 4 3
4 1 4
4
1 2 2
1 3 3
2 4 4
3 4 5
1
2 4 3

输出样例:

5
2
5
2

 思路:

这里给出两种做法,第一种就是老师题解的思路,正反跑一遍,然后一一比较大小差异。。

我们可以思考一下假设不是走1条轻轨,而是k条轻轨,这道题该怎么做。写题稍微多一点的朋友肯定知道k条边限制的题一般都是用分层图最短路去写,感兴趣的朋友可以去看看我写的另一篇博文分层图最短路,感觉有点像拆点,也有点像dp。。

法一:

#include<bits/stdc++.h>
using namespace std;
const int N = 20010;
typedef pair<int, int>PII;
int h[2*N], e[2*N], w[2*N], ne[2*N], idx;
int dis1[N], dis2[N];
bool st1[N], st2[N];
bool flag;
int ans, cnt;
int n, m, k, s, t;
void init()
{ans = 0x3f3f3f3f;cnt = 0x3f3f3f3f;flag = 1;idx = 0;memset(st1, false, sizeof st1);memset(dis1, 0x3f, sizeof dis1);memset(dis2, 0x3f, sizeof dis2);memset(st2, false, sizeof st2);memset(h, -1, sizeof h);memset(e, 0, sizeof e);memset(w, 0, sizeof w);memset(ne, 0, sizeof ne);
}
void add(int a, int b, int c) {e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
void dijkstral(int u,int dis[],bool st[]) {priority_queue<PII, vector<PII>, greater<PII>>q;q.push({ 0,u });dis[u] = 0;while (q.size()) {auto p = q.top();q.pop();int v = p.second;if (st[v]) {continue;}st[v] = true;for (int i = h[v];~i;i = ne[i]) {int j = e[i];if (st[j]) {continue;}if (dis[j] > dis[v] + w[i]) {dis[j] = dis[v] + w[i];q.push({ dis[j],j});}}}
}
void solve()
{while (cin >> n >> s >> t) {init();cin >> m;for (int i = 1;i <= m;i++) {int a, b, c;cin >> a >> b >> c;add(a, b, c);add(b, a, c);}dijkstral(s,dis1,st1);dijkstral(t, dis2, st2);ans = dis1[t];cin >> k;for (int i = 1;i <= k;i++) {int a, b, c;cin >> a >> b >> c;if (dis1[a] + c + dis2[b] < ans) {flag = 0;ans =  dis1[a] + c + dis2[b];cnt = a;}else if (dis1[a] + c + dis2[b] == ans) {cnt = min(a, cnt);}if (dis1[b] + c + dis2[a] < ans) {flag = 0;ans = dis1[b] + c + dis2[a];cnt = b;}else if (dis1[b] + c + dis2[a] == ans) {cnt = min(cnt, b);}}if (flag) {cout << dis1[t] << endl;cout << "no metro" << endl;}else {cout << ans << endl;cout << cnt << endl;}}
}
int main()
{ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);solve();return 0;
}

法二:

#include<bits/stdc++.h>
using namespace std;
const int N = 20010, M = 40010;
typedef pair<int, pair<int, int>>PII;
int h[N], e[M], ne[M], w[M], idx;
int h2[N], e2[M], ne2[M], w2[M], idx2;
int dis[N][2];
bool st[N][2];
int cnt[N];
int n, m, k, s, t;
int ans;
int f;
void add(int a, int b, int c) {e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
void add2(int a, int b, int c) {e2[idx2] = b, w2[idx2] = c, ne2[idx2] = h2[a], h2[a] = idx2++;
}
void dij()
{memset(dis, 0x3f, sizeof dis);memset(st, false, sizeof st);priority_queue<PII, vector<PII>, greater<PII>>q;q.push({ 0,{s,0} });dis[s][0] = 0;while (q.size()) {auto p = q.top();q.pop();int v = p.second.first;int u = p.second.second;if (st[v][u]) {continue;}st[v][u] = true;for (int i = h[v];~i;i = ne[i]) {int j = e[i];if (st[j][u]) {continue;}if (dis[j][u] > dis[v][u] + w[i]) {if (u == 1) {cnt[j] = cnt[v];}dis[j][u] = dis[v][u] + w[i];q.push({ dis[j][u],{j,u} });}}if (u + 1 <= 1) {for (int i = h2[v];~i;i = ne2[i]) {int j = e2[i];if (st[j][u + 1]) {continue;}if (dis[j][u + 1] > dis[v][u] + w2[i]) {dis[j][u + 1] = dis[v][u] + w2[i];cnt[j] = v;q.push({ dis[j][u + 1],{j,u + 1} });}else if (dis[j][u + 1] == dis[v][u] + w2[i]) {cnt[j] = min(cnt[j], v);//q.push({ dis[j][u + 1],{j,u + 1} });}}}}
}
void solve()
{while (cin >> n >> s >> t) {idx = 0;idx2 = 0;f = 0x3f3f3f3f;ans = 0x3f3f3f3f;memset(cnt, 0x3f, sizeof cnt);memset(e, 0, sizeof e);memset(ne, 0, sizeof ne);memset(w, 0, sizeof w);memset(h, -1, sizeof h);memset(e2, 0, sizeof e2);memset(ne2, 0, sizeof ne2);memset(w2, 0, sizeof w2);memset(h2, -1, sizeof h2);cin >> m;for (int i = 1;i <= m;i++) {int a, b, c;cin >> a >> b >> c;add(a, b, c);add(b, a, c);}cin >> k;for (int i = 1;i <= k;i++) {int a, b, c;cin >> a >> b >> c;add2(a, b, c);}dij();if (dis[t][0] <= dis[t][1]) {cout << dis[t][0] << endl;cout << "no metro" << endl;}else {cout << dis[t][1] << endl;cout << cnt[t] << endl;}}}
int main()
{ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);solve();return 0;
}

 

 B 联盟数目

艾迪是一家集团公司的老板,该集团包含n家公司,为了管理公司,艾迪会时常通过网络向各公司发送消息。各公司间的网络是单向的,每个公司都有一个分发列表,表示其能向哪些公司直接传达消息。例如A公司的分发列表为B、C,表示A可将消息直接传送给B和C(由于网络是单向的,B或C不一定能向A传送消息),这样艾迪若想向A、B、C公司发送消息,则只需向A发送消息即可,随后A可将消息传送到B和C。

为了便于管理各公司,艾迪打算将n家公司分成若干组,每组称为一个区域联盟,每组满足如下条件:组内的任意公司消息互相可达。即对于组内任意公司u和v,u可将消息传送到v(可由u直接传送到v,也可通过组内其他公司中转传送到v),v也可将消息传送到u。可以认为一个公司可以将消息传送给自己,即一个公司可以自成一组。

艾迪希望组的数量尽可能少,即在满足上述条件的情况下,每组包含的公司数目尽可能多。

现给定每个公司的分发列表,请编写程序告知艾迪,他的集团最少能分成多少组。

输入格式:

第一行包含一个整数T (1≤T≤100)表示数据组数。对于每组数据,第一行为一个整数n (2≤n≤100),表示公司数目,公司编号为1到n。随后n行,第i行包含若干整数,表示第i个公司的分发列表,每行以0结尾。

输出格式:

对于每组数据,输出一行,为一个整数,表示组数。

输入样例:

3
5
2 4 3 0
4 5 0
0
0
1 0
3
2 0
0
2 1 0
3
2 0
3 0
0

输出样例:

3
3
3

 思路:

这题我们依旧提供两种方法,一个是Floyd,一个是tarjan。

讲真的我以前真不知道Floyd可以求强连通分量。。

可能是n3次方太可拍了。。

Floyd

#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int dis[N][N];
bool st[N];
int n;
int ans;
void init()
{memset(dis, 0x3f, sizeof dis);memset(st, false, sizeof st);ans = 0;for (int i = 1;i <= n;i++) {dis[i][i] = 0;}
}
void solve()
{cin >> n;init();for (int i = 1;i <= n;i++) {int k;while (cin >> k && k != 0) {dis[i][k] = 1;}}for (int k = 1;k <= n;k++) {for (int i = 1;i <= n;i++) {for (int j = 1;j <= n;j++) {if (dis[i][j] > dis[i][k] + dis[k][j]) {dis[i][j] = dis[i][k] + dis[k][j];}}}}for (int i = 1;i <= n;i++) {if (st[i]) {continue;}st[i] = true;for (int j = i + 1;j <= n;j++) {if (st[j]) {continue;}if (dis[i][j] != 0x3f3f3f3f && dis[j][i] != 0x3f3f3f3f) {st[j] = true;}}ans++;}cout << ans<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int T;cin >> T;while (T--) {solve();}return 0;
}

tarjan:

#include<bits/stdc++.h>
using namespace std;
const int N = 110, M = N * N;
int h[N], e[M], ne[M], idx;
int scc_cnt, id[N], _size[N];
int dfn[N], low[N];
int stk[N], top;
bool in_stk[N];
int timestamp;
int n;
void init()
{timestamp = 0;scc_cnt = 0;top = 0;idx = 0;memset(h, -1, sizeof h);memset(e, 0, sizeof e);memset(ne, 0, sizeof ne);memset(id, 0 ,sizeof id);memset(_size, 0, sizeof _size);memset(dfn, 0, sizeof dfn);memset(stk, 0, sizeof stk);memset(low, 0, sizeof low);memset(in_stk, false, sizeof in_stk);
}
void add(int a, int b) {e[idx] = b, ne[idx] = h[a];h[a] = idx++;
}void tarjan(int u)
{dfn[u] = low[u] = ++timestamp;stk[++top] = u, in_stk[u] = true;for (int i = h[u];i != -1;i = ne[i]){int j = e[i];if (!dfn[j]) {tarjan(j);low[u] = min(low[u], low[j]);}else if (in_stk[j]) {low[u] = min(low[u], low[j]);}}if (dfn[u] == low[u]) {int y;scc_cnt++;do {y = stk[top--];in_stk[y] = false;id[y] = scc_cnt;_size[scc_cnt]++;} while (u != y);}
}void solve()
{init();cin >> n;for (int i = 1;i <= n;i++) {int k =-1;while (cin >> k && k != 0) {add(i, k);}}for (int i = 1;i <= n;i++) {if (dfn[i]) {continue;}else {tarjan(i);}}cout << scc_cnt << endl;}
int main()
{ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int T;cin >> T;while (T--) {solve();}return 0;
}

这里的tarjan不需要这么麻烦,我只是写一个模板写多了。。

 C 社交网络

可以将n个QQ用户间的好友关系建模为一个包含n个顶点的无向图,顶点编号为1至n,每个顶点对应一个用户,若2个用户i和j是QQ好友,则在顶点i和j之间连接一条边,并根据用户间的亲密度对该边附以一个权值cij​。在该图中,可以利用两个顶点间的最短路径长度衡量两个用户的关系密切程度,也可以利用经过一个顶点的最短路径数目来衡量一个用户在关系网络中的影响力,具体地,我们定义用户k在QQ关系网络中的“影响力”为:

 

895d2abdc3975abc5a1643aadf3d44da.png

其中Nij​为顶点i到j的最短路径数目,Nijk​为顶点i到j的所有最短路径中经过顶点k的最短路径数目(上述二值可能超出int型范围,请使用long long类型)。Dij​表示i到j的最短路径长度。

现给定一个如上描述的无向图,请编写程序,计算每个顶点的“影响力”,假定给定的图是连通的。

输入格式:

输入第一行为两个正整数n和e,分别表示图的顶点数和边数,接下来e行表示每条边的信息,每行为3个正整数a、b、c,其中a和b表示该边的端点编号,c表示权值。各边并非按端点编号顺序排列。

n≤100,e≤5000,c≤1000,任意两点间的最短路径数目≤1010

输出格式:

输出为n行,每行一个实数,精确到小数点后3位,第i行为顶点i的影响力。

输入样例:

4 4
3 2 6
4 3 1
1 3 9
4 1 1

输出样例:

0.000
0.000
30.000
20.000

解释:

对于顶点1:边2-3、3-4、2-4的最短路径均不经过顶点1,故顶点1的影响力为0.

对于顶点3:
顶点1到2的最短路径共1条,长度为8,经过点3,顶点2到4的最短路径共1条,长度为7,经过点3,顶点1到4的最短路径共1条,但不经过点3。
故f(3)=D12​∗1+D24​∗1+D14​∗0+D21​∗1+D42​∗1+D41​∗0=8+7+0+8+7+0=30.000

提示:

若顶点a到顶点b有x条路径,点b到点c有y条路径,则a经过b到达c的路径有x*y条。

 思路:

这题是最简单的有没有人同感。。

就是简单的dijktra。。

只是一定要小心longlong相乘会越界,改成double就好了。

#include<bits/stdc++.h>
using namespace std;
const int N = 110, M = 10010;
typedef long long LL;
typedef pair<LL, int>PII;
LL dis[N][N];
bool st[N][N];
int h[N], e[M], ne[M], w[M], idx;
LL cnt[N][N];
int n, m;
double ans[N];
void add(int a, int b, int c) {e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
void dijkstral(int u) {priority_queue<PII, vector<PII>, greater<PII>>q;q.push({ 0,u });dis[u][u] = 0;cnt[u][u] = 1;while (q.size()) {auto t = q.top();q.pop();int v = t.second;if (st[u][v]) {continue;}st[u][v] = true;for (int i = h[v];~i;i = ne[i]) {int j = e[i];if (st[u][j]) {continue;}if (dis[u][j] > dis[u][v] + w[i]) {dis[u][j] = dis[u][v] + w[i];cnt[u][j] = cnt[u][v];q.push({ dis[u][j],j});}else if (dis[u][j] == dis[u][v]+w[i]) {cnt[u][j] += cnt[u][v];q.push({ dis[u][j],j});}}}
}
void solve()
{cin >> n >> m;memset(st, false, sizeof st);memset(h, -1, sizeof h);memset(dis, 0x3f, sizeof dis);for (int i = 1;i <= m;i++) {int a, b, c;cin >> a >> b >> c;add(a, b, c);add(b, a, c);}for (int i = 1;i <= n;i++) {dijkstral(i);}for (int i = 1;i <= n;i++) {for (int j = 1;j <= n;j++) {for (int k = 1;k <= n;k++) {//cout << dis[j][k] << endl;//cout << cnt[j][k] << endl;if (j == i || k == i) {continue;}if (dis[j][k] == 0x3f3f3f3f||dis[j][i]==0x3f3f3f3f||dis[i][k]==0x3f3f3f3f) {continue;}if (cnt[j][i] == 0 || cnt[i][k]==0) {continue;}if (dis[j][k] != dis[j][i] + dis[i][k]) {continue;}//cout << i << " " << j << " " << k << endl;double x = cnt[j][i] * cnt[i][k];double y = x / cnt[j][k];ans[i] += y * dis[j][k];}}}for (int i = 1;i <= n;i++) {cout << fixed << setprecision(3) << ans[i] << endl;}
}
int main()
{ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);solve();return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/485491.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB 最小二乘点云拟合球 (89)

MATLAB 最小二乘点云拟合球 (89) 一、算法介绍二、算法实现1.代码2.结果这是缘,亦是最美的相见 一、算法介绍 球面拟合算法是一种通过数学方法将一组三维点(通常在三维空间中分布)拟合到一个理想的球形表面上。这个过程通常涉及使用最小二乘法来最小化实际数据点与拟合的…

短视频矩阵系统开发|技术源代码部署

短视频矩阵系统通过多账号运营管理、多平台视频智能分发等功能&#xff0c;助力企业实现视频引流、粉丝沉淀和转化。 短视频矩阵系统是一种创新的营销工具&#xff0c;它整合了多账号管理、视频智能分发、数据可视化等多种功能&#xff0c;为企业在短视频领域的发展提供了强大…

若依 ruoyi VUE el-select 直接获取 选择option 的 label和value

1、最新在研究若依这个项目&#xff0c;我使用的是前后端分离的方案&#xff0c;RuoYi-Vue-fast(后端) RuoYi-Vue-->ruoyi-ui(前端)。RuoYi-Vue-fast是单应用版本没有区分那么多的modules 自己开发起来很方便&#xff0c;这个项目运行起来很方便&#xff0c;但是需要自定义的…

【0x01】HCI_Inquiry_Complete事件详解

目录 一、事件概述 二、事件格式及参数 2.1. HCI_Inquiry_Complete事件格式 2.2. 参数 三、HCI_Inquiry_Complete事件触发机制 3.1. 基于查询命令完成的触发 3.2. 受查询环境和设备状态影响的触发 3.3. 与蓝牙协议栈内部逻辑相关的触发 四、事件处理流程 4.1. 事件接…

【Linux系统编程】——Linux操作系统的魔法桥梁:从命令行到内核的奇遇记

文章目录 Linux操作系统的概念&#xff08;是什么&#xff1f;&#xff09;设计操作系统的目的(为什么&#xff1f;)核心功能(怎么办&#xff1f;)如何理解“管理”——软硬件的管理硬件管理软件管理 系统调⽤和库函数概念系统调用&#xff08;System Call&#xff09;库函数&a…

VBA基础2

VBA基础2 sub过程语法对单元格进行赋值操作连续赋值不连续赋值 cells &#xff08;行&#xff0c;列&#xff09;行引用rows列引用 &#xff08;columns&#xff09;offset位移属性End属性&#xff08;指定返回&#xff09; 使用VBA编辑器需要用AltF11打开 或者VB编辑器打开 可…

支持win7系统的onnxruntime

在win7 X86系统上&#xff0c;使用了onnxruntime.dll库做AI识别&#xff0c;但是在win7上运行报0xc0000005的错误 经查&#xff0c;ONNX Runtime从v1.15.0版本开始不再支持Windows 7及其之前的操作系统&#xff0c;即便尝试重新编译源代码亦无法在这些老系统上运行&#xff0c;…

【服务器监控】grafana+Prometheus+node exporter详细部署文档

我们在进行测试时&#xff0c;不可能一直手动看着服务器的性能消耗&#xff0c;这时候就需要有个工具替我们监控服务器的性能消耗。这里记录下grafanaPrometheusnodeExporter的组合用于监控服务器。 简单介绍&#xff1a; grafana&#xff1a;看板工具&#xff0c;所有采集的…

【密码学】分组密码的工作模式

1.电码本模式&#xff08;ECB&#xff09; 优点: 每个数据块独立加密&#xff0c;可并行加密&#xff0c;实现简单。 缺点: 相同明文会产生相同密文&#xff0c;不具备数据完整保护性。 适用于短消息的加密传输 (如一个加密密钥)。 工作流程&#xff1a;用相同的密钥分别对…

PR时间轴

简介 时间轴记录整个项目所发生的一切&#xff0c;它包括视频轨道、音频轨道、字幕轨道&#xff0c;可以队单独的任意轨道进行编辑。 时间轴上还可以使用编辑点对素材进行简单编辑&#xff0c;也可以锁定轨道保证素材不会被其他操作改变。 播放指示器&#xff08;指针&#x…

【RBF SBN READ】hadoop社区基于RBF的SBN READ请求流转

读写分离功能的背景及架构 当前联邦生产集群的各个子集群只有Active NameNode在工作,当读写任务变得繁忙的时候,只有一个Active负责处理的话,此时集群的响应和处理能力业务侧感知会明显下降,为此,我们将引入Observer架构,实现读写功能的分离,使得Active只负责写请求,而…

记事本建java及java命名规范

1.桌面开发&#xff1a;c# 2. 记事本建java&#xff1a; 以class的名称(类名)为名&#xff0c;名称.java 编译jdk&#xff1a;javac 名称.java 调动运行jre : java 名称 查看名称.java里面的内容&#xff1a;cat 名称.java java 的命名规范 大驼峰&#xff08;每个单词首…

YOLOv8模型改进 第二十讲 添加三重注意力机制Triplet Attention 提升小目标/遮挡目标

本文这次分享的是三重注意力机制Triplet Attention。现在注意力机制在计算机视觉任务中被广泛研究和应用&#xff0c;如 Squeeze-and-Excitation Networks (SENet)、Convolutional Block Attention Module (CBAM) 等。然而&#xff0c;这些方法存在一些局限性&#xff0c;例如需…

2024年认证杯SPSSPRO杯数学建模D题(第一阶段)AI绘画带来的挑战解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 D题 AI绘画带来的挑战 原题再现&#xff1a; 2023 年开年&#xff0c;ChatGPT 作为一款聊天型AI工具&#xff0c;成为了超越疫情的热门词条&#xff1b;而在AI的另一个分支——绘图领域&#xff0c;一款名为Midjourney&#xff08;MJ&#xff…

如何修复和防止 500 内部服务器错误的发生

当遭遇 500 内部错误时&#xff0c;意味着服务器出现了意外状况&#xff0c;以至于无法对请求予以回应。这种错误往往源于服务器端的各类问题&#xff0c;像是服务器配置出现偏差、脚本存在漏洞或者服务器瞬间负荷过重等。在不少情形下&#xff0c;服务器管理员能够化解此难题&…

算法刷题Day11: BM33 二叉树的镜像

点击题目链接 思路 转换为子问题&#xff1a;左右子树相反转。遍历手法&#xff1a;后序遍历 代码 class Solution:def Transverse(self,root: TreeNode):if root None:return rootnewleft self.Transverse(root.left)newright self.Transverse(root.right)# 对root节点…

【项目】基于YOLOv10的目标检测项目

【项目】基于YOLOv10的目标检测项目 &#xff08;一&#xff09;模型性能&#xff08;二&#xff09;安装与使用&#xff08;1&#xff09;环境安装&#xff08;2&#xff09;快速使用&#xff08;3&#xff09;模型评估Validation&#xff08;4&#xff09;模型训练Training&a…

与火山引擎合作深化,观测云携一站式监控解决方案登陆万有商城

近日&#xff0c;观测云正式宣布入驻火山引擎的万有商城。作为一款全栈式数据观测与分析平台&#xff0c;观测云的加入不仅丰富了火山引擎生态&#xff0c;也为广大企业用户带来了更便捷的数字化工具&#xff0c;助力企业快速实现业务监控与优化。 从全球覆盖到本地深耕&#x…

计算机网络原理之HTTP与HTTPS

一、前言 为了理解HTTP&#xff0c;我们有必要事先了解一下TCP/IP协议簇。 通常我们使用的网络&#xff08;包括互联网&#xff09;是在TCP/IP协议簇的基础上运作的。而HTTP属于它内部的一个子集。 计算机与网络设备要相互通信&#xff0c;双方必须基于相同的方法。比如&#…

java注解(二):注解的解析以及应用场景、用注解和反射模拟junit框架代码演示

目录 1、什么是注解的解析&#xff1f; 2、解析注解的案例 1、自定义一个注解 2、在类和方法上使用自己定义的注解 3、解析注解 3、模拟Junit框架案例 1、自定义一个MyTest注解 2、定义一个测试类&#xff0c;使用自定义的注解 3、写一个启动类 本文章主要讲解什么是注…