图论题目集一(代码 注解)

目录

题目一: 

题目二:

题目三:

题目四:

题目五:

题目六:

题目七:

题目一: 

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int g[15][15], vis[15] = { 0 };
int n, m;
queue<int> q;
void dfs(int k)//深度
{cout << k << " ";vis[k] = 1;for (int i = 0; i < n; i++){if (i == k)continue;if (vis[i] == 0 && g[k][i]){dfs(i);}}return;
}
void bfs(int k)//广度
{q.push(k);while (!q.empty()){k = q.front();q.pop();if(vis[k]==0){cout<<k<<" ";vis[k]=1;}for (int i = 0; i < n; i++){if (vis[i] == 0 && g[k][i] == 1){q.push(i);}}}return;
}
int main()
{cin >> n >> m;for (int i = 1; i <= m; i++)//构建邻接矩阵{int x, y;cin >> x >> y;g[x][y] = 1, g[y][x] = 1;}for (int i = 0; i < n; i++)//深度{if (vis[i] == 0){cout << "{ ";dfs(i);cout << "}" << endl;}}memset(vis, 0, sizeof(vis));for (int i = 0; i < n; i++)//广度{if(vis[i]==0){cout << "{ ";bfs(i);cout << "}" << endl;}}
}

 题目二:

#include<iostream>
#include<algorithm>
using namespace std;
int g[10005][10005];
float n, k;
typedef struct node
{int data;int w = 0;
}node;
void warshall()//传递闭包
{for (int k = 1; k <= n; k++)for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++){if (g[i][k] && g[k][j])//连通{if (i == j)continue;if (g[i][j] == 0 || g[i][j] > g[i][k] + g[k][j])//没有直接连通或者新通路距离小于之前通路g[i][j] = g[i][k] + g[k][j];}}
}
bool cmp(node a, node b)
{return a.w < b.w;
}
int main()
{cin >> n >> k;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)g[i][j] = 0;for (int i = 0; i < k; i++)//无向图,初始距离都为1{int v1, v2;cin >> v1 >> v2;g[v1][v2] = 1;g[v2][v1] = 1;}warshall();/*for (int i = 1; i <= n; i++)//输出邻接矩阵{for (int j = 1; j <= n; j++)cout << g[i][j] << " ";cout << endl;}*/float ans[10005] ;for (int i = 1; i <= n; i++){ans[i] = 0;for (int j = 1; j <= n; j++){if (i == j)ans[i]++;if (g[i][j]>0 && g[i][j] <= 6)//符合条件ans[i]++;}}for (int i = 1; i <= n; i++)printf("%d:% .2f%%\n", i, ans[i] / n * 100);
}

题目三:

#include<iostream>
using namespace std;
int g[1010][1010];
int n,m,s;
int vis[1010];
int path[1010];
int cnt=0;
void dfs(int k)//深度
{//cout<<k<<" ";path[cnt++]=k;//记录去的路径vis[k]=1;for(int i=0;i<=n;i++){if(i==k)continue;if(vis[i]==0&&g[k][i]==1){dfs(i);path[cnt++]=k;//记录回的路径}}return ;
}
int main()
{cin>>n>>m>>s;for(int i=1;i<=m;i++)//构建邻接矩阵{int x,y;cin>>x>>y;g[x][y]=g[y][x]=1;}dfs(s);int flag=1;//标记是否可以遍历完所有for(int i=1;i<=n;i++)//查询是否遍历完所有{if(vis[i]==0){flag=0;break;}}if(flag==1)//输出序列{for(int i=0;i<cnt;i++){cout<<path[i];if(i!=cnt-1)cout<<" ";}}else{for(int i=0;i<cnt;i++)cout<<path[i]<<" ";cout<<0;}
}

题目四:

#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
typedef long long ll;
const ll N = 3e5 + 10, M = 1e6 + 10, inf = 1e14;
struct  node
{ll v, w;bool operator <(const node& y) const//重载一个<,用于优先队列排序{return w > y.w;//小到大}
};
int n, m, t;
priority_queue<node>q;
vector<node> e[N];
ll dis[N], vis[N];
void Dij(int t)
{dis[t] = 0;//从t号点出发,表示从t到t距离为0q.push({ t,dis[t] });//t号点以及到t的距离入队while (q.size()){int u = q.top().v;//取最小边相连的点出队q.pop();if (vis[u])//访问过则跳过continue;vis[u] = 1;//没访问赋为访问for (auto i : e[u])//遍历以u为出发点的边{int v = i.v, w = i.w;//取其相连的点及权值if (dis[v] > dis[u] + w)//经过u点到v点的权值小于之前的权值则更新{dis[v] = dis[u] + w;q.push({ v,dis[v] });//v点以及到v的距离}}}}
int main()
{cin >> n >> m;for (int i = 1; i <= m; i++){int x, y, w=1;cin >> x >> y;e[x].push_back({ y,w });//存入以x出发到y,权值为we[y].push_back({ x,w });//存入以x出发到y,权值为w}int N;cin >> N;while (N--){cin >> t;float ans = 0,sum=0;memset(dis, 0x3f3f3f, sizeof(dis));memset(vis, 0, sizeof(vis));Dij(t);//从t点出发for (int i = 1; i <= n; i++){sum += dis[i];//求和}//cout << sum;ans = (n - 1) /sum;printf("Cc(%d)=%.2f\n", t, ans);}
}

题目五:

#include<iostream>//并查集
using namespace std;
int fa[204], mp[102][102];
int find(int x)//查找
{if(fa[x]==x)  return x;return fa[x]=find(fa[x]);
}
void Merge(int x, int y)//合并
{int a=find(x), b=find(y);if(a==b) return;else fa[a]=fa[b];
}
int main()
{int n, m, k;cin>>n>>m>>k;int a, b, c;for(int i=1;i<=n;i++)//初始化fa[i]=i;for(int i=0; i<m; i++){cin>>a>>b>>c;mp[a][b]=c,mp[b][a]=c;if(c==1)//为朋友则合并,因为朋友的朋友也是朋友Merge(a, b);}for(int i=0; i<k; i++){cin>>a>>b;if(mp[a][b]==1) cout<<"No problem"<<endl;else if(mp[a][b]==-1)//是敌对关系{if(find(a)==find(b))    cout<<"OK but..."<<endl;//但是有相同的朋友,即在一个集合内else cout<<"No way"<<endl;}else cout<<"OK"<<endl;}return 0;
}

题目六:

#include<iostream>
using namespace std;
int n, m, mp[520][520], f[520];
void init() //初始化
{for (int i = 0; i < n; i++)f[i] = i;
}
int find(int x) //查询
{if (x == f[x]) return x;return f[x] = find(f[x]);
}
void merge(int x, int y)//合并 
{int xx = find(x);int yy = find(y);if (xx != yy) f[xx] = yy;return;
}
int sum()//统计连通块个数
{int cnt = 0;for (int i = 0; i < n; i++) //统计连通块个数 {if (i == find(i)) cnt++;}return cnt;
}
int main() 
{int a, b, k, x, cnt = 0, cnt2, flag = 0;cin >> n >> m;init();while (m--) {cin >> a >> b;mp[a][b] = 1;mp[b][a] = 1;merge(a, b);}cin >> k;cnt = sum();if (k == n) flag = 1; //要输出Game Over; while (k--) {cin >> x;init();cnt2 = 0;  //x去掉后的连通区域个数 for (int i = 0; i < n; i++) mp[x][i] = mp[i][x] = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++){if (mp[i][j]) merge(i, j);}}cnt2 = sum();if (cnt2 < cnt + 2) cout << "City " << x << " is lost." << endl;else cout << "Red Alert: City " << x << " is lost!" << endl;//1、去掉i点后,一个连通块至少被分为两个,增加了一个cnt = cnt2;                                                 //2、去掉i点后,再次统计cnt2时,就会把去掉的点i也加上,所以要大于cnt+1}if (flag) cout << "Game Over." << endl;
}

题目七:

#include<iostream>
#include<queue>
using namespace std;
int n, id, fa, ma, k;
int f[10100], peo[10100], avgs[10100], avga[10100],st[10100];
struct node
{int a, b;
}e[10100];
struct family
{int id, peo, avgs, avga;bool operator<(const family& x)const{if (x.peo * avga == peo * x.avga)//人均相等,则升序排序return id > x.id;return x.peo * avga < peo * x.avga;//人均多的在前}
};
int find(int x)//查找
{if (f[x] == x) return x;return f[x] = find(f[x]);
}
void meger(int x, int y)//合并
{x = find(x), y = find(y);if (x != y){f[max(x, y)] = min(x, y);//小号id的设为父亲peo[min(x, y)] += peo[max(x, y)];//家庭人数加到小号idavgs[min(x, y)] += avgs[max(x, y)];//房屋数量加到小号idavga[min(x, y)] += avga[max(x, y)];//服务面积加到小号面积}
}
int main()
{for (int i = 0; i < 10100; i++) f[i] = i, peo[i] = 1;//初始化,每个父亲节点是自己,自己家庭都有一个自己cin >> n;int count = 0;for (int i = 1; i <= n; i++){cin >> id >> fa >> ma >> k;if (fa != -1) e[count++] = { id,fa };//存关系if (ma != -1) e[count++] = { id,ma };//存关系st[id] = 1;//存在这个人int kid;for (int j = 1; j <= k; j++){cin >> kid;e[count++] = { id,kid };//存关系}cin >> avgs[id] >> avga[id];}for (int i = 0; i < count; i++)//合并家庭{int a = e[i].a, b = e[i].b;st[a] = st[b] = 1;meger(a, b);//合并二者为一个家庭}priority_queue<family>ans;//优先队列for (int i = 0; i < 10100; i++){if (st[i] && f[i] == i)//这个人存在且父亲节点是自己ans.push({ i,peo[i],avgs[i],avga[i] });}//count << st[8888] << f[8888];cout << ans.size() << endl;while (!ans.empty()){family t = ans.top();ans.pop();printf("%04d %d %.3lf %.3lf\n", t.id, t.peo, (double)t.avgs / t.peo, (double)t.avga / t.peo);}
}

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

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

相关文章

<商务世界>《第15课 投标文件一般包含的子文件》

1 响应文件封面 招标文件中的响应文件封面是投标人或参与者在提交响应文件时所使用的封面设计。这个封面不仅仅是文件的外包装&#xff0c;更是投标人形象和专业素质的直观展示&#xff0c;对于给招标方留下良好的第一印象至关重要。 首先&#xff0c;响应文件封面通常会包含…

java中下载多个文件和文件夹打压缩包下载,并自定义包中每个文件的名称

我的需求是一个可以批量下载文件或文件夹的接口&#xff0c;下载一个文件就正常下载&#xff0c;下载多个文件或单个多个文件夹都压缩成zip下载 本来想的是直接用hutool里面的ziputil工具类就行&#xff0c;但是我这里报错的文件都是用随机字符串命名的&#xff0c;直接用ZipUt…

硬盘哨兵Hard Disk Sentinel Pro V6.20.0.0 便携版

Hard Disk Sentinel 是一款功能强大的硬盘监控和分析软件&#xff0c;专为 Windows 用户设计。它可以实时监测硬盘驱动器&#xff08;HDD&#xff09;、固态硬盘&#xff08;SSD&#xff09;、混合硬盘&#xff08;SSHD&#xff09;、NVMe SSD、RAID 数组和外部 RAID 盒子的健康…

uniapp可视范围高度 - 用户屏幕可操作的屏幕高度 - 适用于APP、H5@公众号、纯H5@Chrome

可视范围高度 let heightPx uni.getWindowInfo().windowHeight uni.getWindowInfo().windowTop 官方手册 uni.getWindowInfo() | uni-app官网uni-app,uniCloud,serverless,uni.getWindowInfo()https://uniapp.dcloud.net.cn/api/system/getWindowInfo.html 实测数据 uni.ge…

【精准】北斗同步时钟(北斗卫星授时服务器)助力医疗信息化

【精准】北斗同步时钟&#xff08;北斗卫星授时服务器&#xff09;助力医疗信息化 【精准】北斗同步时钟&#xff08;北斗卫星授时服务器&#xff09;助力医疗信息化 北斗时钟同步服务器是一款支持NTP和SNTP网络时间同步协议&#xff0c;高精度、大容量、高品质的高科技时钟产品…

十、MySQL主从架构配置

一、资源配置 主库&#xff1a;192.168.134.132 从库&#xff1a;192.168.134.133 从库&#xff1a;192.168.134.134 二、主从同步基本原理&#xff1a; master用户写入数据&#xff0c;会生成event记录到binary log中&#xff0c;slave会从master读取binlog来进行数据同步…

Java安全 反序列化(1) URLDNS链原理分析

Java安全 反序列化(1) URLDNS链原理分析 文章目录 Java安全 反序列化(1) URLDNS链原理分析前置知识应用分析payload1.新建HashMap类2.新建URL类3.获取URL 的 Class对象4.通过反射访问URL内部变量5.通过反射为URL中类赋值6.调用HashMap#put方法传入key和value7.再次通过反射为UR…

铝壳电阻的工艺结构原理及选型参数总结

🏡《总目录》 目录 1,概述2,工作原理3,结构特点4,工艺流程4.1,原材料准备4.2,点胶4.3,高温烘烤4.4,组合4.5,焊接4.6,表面处理4.7,电气性能测试5,选型参数5.1,阻值(Resis

ocp考试是中文还是英文?ocp认证好考吗

ocp认证是中文还是英文考试ocp认证的考试常用语种是英文&#xff0c;除开英文之外还有日语等语种&#xff0c;但是目前没有中文(12c的时候有过中文考试)&#xff0c;所以考生最好具有一定的英语水平再报名参加考试&#xff0c;ocp认证考试的形式为机试&#xff0c;考试的题型全…

面向未来的前沿人工智能监管

策制定者应该为未来十年人工智能系统更加强大的世界做好准备。这些发展可能会在人工智能科学没有根本性突破的情况下发生&#xff0c;只需扩展当今的技术以在更多数据和计算上训练更大的模型即可。 用于训练前沿人工智能模型的计算量在未来十年可能会显着增加。到 2020 年代末…

kafka什么情况下会认为发送失败进而去重试

在Kafka中&#xff0c;发送消息的过程是异步的&#xff0c;即消息后不会立即得到发送结果。Kafka会将消息添加到发送缓冲区&#xff0c;并立即返回一个成功的响应。因此&#xff0c;Kafka并不会直接知道消息是否成功发送到了目标主题的分区。 Kafka在以下情况下会认为发送失败…

03.生命周期和工程化开发入门

一、Vue生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09;什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a;就是一个Vue实例从创建 到 销毁 的整个过程。 生命…

【Linux】日常使用命令(三)

文章目录 **cal 命令****date 命令****bc 命令****Linux下玩小游戏**&#xff1a; cal 命令 功能描述: cal 命令用于显示日历。 常用选项: -3&#xff1a;显示前一个月、当前月和下一个月的日历。-y&#xff1a;显示整年的日历。 常用示例: # 示例 1: 显示当前月的日历 cal# …

MyBatis3源码深度解析(十四)SqlSession的创建与执行(一)Configuration与SqlSession的创建过程

文章目录 第五章 SqlSssion的创建过程前言5.1 XPath方法解析XML文件5.1.1 XPath的基本用法5.1.2 MyBatis使用XPathParser工具类 5.2 Configuration实例创建过程5.3 SqlSession实例创建过程 第五章 SqlSssion的创建过程 前言 MyBatis的核心组件之一SqlSession对象&#xff0c;…

python知识点总结(四)

这里写目录标题 1、Django 中的缓存是怎么用的&#xff1f;2、现有2元、3元、5元共三种面额的货币&#xff0c;如果需要找零99元&#xff0c;一共有多少种找零的方式?3、代码执行结果4、下面的代码执行结果为&#xff1a;5、说一下Python中变量的作用域。6、闭包7、python2与p…

css属性选择器总结

属性选择器 属性选择器在 CSS2 中就已经被引入&#xff0c;并且在 CSS3 及更高版本中仍然被广泛使用&#xff0c;因为它们提供了一种灵活且强大的方式来选择具有特定属性的元素。 [attr]&#xff1a; 是一个属性选择器&#xff0c;用于选择具有指定属性的所有元素&#xff0c;…

发票OCR-国税可进行的发票查验种类-接口文档

发票查验内容包括发票种类名称、发票代码、发票号码、金额、销售方名称、购买方名称等信息。可以在国家税务总局全国增值税发票查验平台上进行查验&#xff0c;也可以进入发票所属省、直辖市税务局官方网站的“我要查询-发票查询”模块进行查验&#xff0c;企业也可以通过发…

二叉树遍历(牛客网)

描述 编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以指针方式存储&#xff09;。 例如如下的先序遍历字符串&#xff1a; ABC##DE#G##F### 其中“#”表示的是空格&#xff0c;空格字符代表空树。建立起此二叉树…

LeetCode_29_中等_两数相除

文章目录 1. 题目2. 思路及代码实现详解&#xff08;Python&#xff09;2.1 位运算与二分查找 1. 题目 给你两个整数&#xff0c;被除数 d i v i d e n d dividend dividend 和除数 d i v i s o r divisor divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算…

20240318uniapp怎么引用组件

在script中增加 import index from "/pages/index/index.vue" 把index直接整个作为一个组件引入 然后注册组件 在export default中增加 components: {index:index }, 注册了index组件&#xff0c;内容为import的index 然后就可以在template里使用 <index&…