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

news2024/9/20 16:33:48

目录

题目一: 

题目二:

题目三:

题目四:

题目五:

题目六:

题目七:

题目一: 

#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距离为0
    q.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,权值为w
        e[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)];//家庭人数加到小号id
		avgs[min(x, y)] += avgs[max(x, y)];//房屋数量加到小号id
		avga[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.coloradmin.cn/o/1528001.html

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

相关文章

目标检测——YOLOv5算法解读

作者&#xff1a;UltralyticsLLC公司 代码&#xff1a;https://github.com/ultralytics/yolov5 YOLO系列算法解读&#xff1a; YOLOv1通俗易懂版解读SSD算法解读YOLOv2算法解读YOLOv3算法解读YOLOv4算法解读YOLOv5算法解读 PP-YOLO系列算法解读&#xff1a; PP-YOLO算法解读…

Css提高——Css3的新增选择器

目录 1、Css3新增选择器列举 2、属性选择器 2.1、语法 2.2、代码&#xff1a; 2.3、效果图 3、结构伪类选择器 3.1、语法 3.2、代码 3.3、效果图 3.4、nth&#xff1a;child&#xff08;n&#xff09;的用法拓展 nth-child&#xff08;n&#xff09;与nth-of-type&#x…

【Spring MVC】Spring MVC拦截器(Interceptor)

目录 一、拦截器介绍 二、拦截器 Interceptor 定义 2.1 HandlerInterceptor接口 2.2 Spring MVC中提供的一些HandlerInterceptor接口实现类 1、AsyncHandlerInterceptor 2、WebRequestInterceptor 3、MappedInterceptor 4、ConversionServiceExposingInterceptor 三、拦…

Python之Web开发中级教程----ubuntu安装MySQL

Python之Web开发中级教程----ubuntu安装MySQL 进入/opt目录 cd /opt 更新软件源 sudo apt-get upgrade sudo apt-get update 3、安装Mysql server sudo apt-get install mysql-server 4、启动Mysql service mysql start 5、确认Mysql的状态 service mysql status 6、安装My…

天眼销批量查询功能上线

天眼销是一款提供企业线索的产品&#xff0c;致力于帮助客户获取最新的企业联系方式、工商信息等关键数据。 数据库收录全国 3.3亿及以上企业(含个体)线索&#xff0c;涵盖企业名称、企业状态、注册时间、注册资本、经营范围、法人信息、联系方式等维度&#xff0c;为用户提供…

免费SSL证书哪个更好

当下为了实现网站的https访问&#xff0c;很多的站点都会在自己的网站上部署使用SSL证书。 从2018年7月1日开始&#xff0c;Chrome将显示所有未使用SSL证书的网站标记为“不安全”&#xff0c;SSL证书&#xff0c;用于加密HTTP协议&#xff0c;也就是HTTPS。随着https的普及度…

智能合约 - ERC20介绍

什么是ERC20 ERC20全称为Ethereum Request for Comment 20&#xff0c;是一种智能合约标准&#xff0c;用于以太坊网络上的代币发行 姊妹篇 - 如何部署ERC20 ERC20的应用场景 代币化资产&#xff0c;例如&#xff1a;USDT 是一种以美元为背书的ERC20代币&#xff0c;每个USDT代…

adobe animate 时间轴找不到编辑多个帧按钮

如题&#xff0c;找了半天&#xff0c;在时间轴上找不到编辑多个帧按钮,导致无法批量处理帧 然后搜索发现原来是有些版本被隐藏了&#xff0c;需要再设置一下 勾选上就好了

一款基于 SpringCloud 开发的AI聊天机器人系统,已对接GPT-4.0,非常强大

简介 一个基于SpringCloud的Chatgpt机器人&#xff0c;已对接GPT-3.5、GPT-4.0、百度文心一言、stable diffusion AI绘图、Midjourney绘图。用户可以在界面上与聊天机器人进行对话&#xff0c;聊天机器人会根据用户的输入自动生成回复。同时也支持画图&#xff0c;用户输入文本…

赛昉(starFive)星光2 多媒体框架分析与功能验证

开发板 开发板长这个样子: 串口调试接口如下: 整体支持情况 驱动&firmware&API jh7110/soft_3rdpart/wave511 : H.264&H.265 Decoder (Chips&Media 芯媒)jh7110/soft_3rdpart/wave521 : H.264&H.265 Encoder (Chips&Media 芯媒)jh7110/soft_3rdp…

什么是CPU?CPU的性能指标是什么?

我们在就看一台笔记本电脑配置时&#xff0c;必然要关注CPU的型号与性能&#xff0c;那么你知道什么是CPU吗&#xff1f;CPU的性能指标又是什么呢&#xff1f;如何来衡量这款CPU的性能是不是很强大&#xff1f;我们来一起看一下&#xff01; 什么是CPU CPU&#xff0c;全称中央…

C++手写链表、反转链表、删除链表节点、遍历、为链表增加迭代器

本篇博客介绍如何使用C实现链表&#xff0c;首先编写一个简单的链表&#xff0c;然后增加模板&#xff0c;再增加迭代器。 简单链表的实现 链表的结构如下&#xff1a; 首先需要定义链表的节点&#xff1a; struct ListNode {int data;ListNode* pNext;ListNode(int value …

[Linux]互斥锁(什么是锁,为什么需要锁,怎么使用锁(接口),演示代码)

目录 一、锁的概念 一些需要了解的概念 什么是锁&#xff1f;为什么需要锁&#xff1f;什么时候使用锁&#xff1f;怎么定义锁&#xff1f; 二、锁的接口 1.初始化锁 2.加锁 3.申请锁 4.解锁 5.销毁锁 三、实践&#xff08;写代码&#xff09;&#xff1a;黄牛抢票 M…

C#开发中方法使用的问题注意

C#开发中&#xff0c;我们在进行方法内嵌时&#xff0c;需要注意方法回传带值时&#xff0c;我们需要对方法回传的值进行一个赋值传递 如下所示 console.WriteLine("请输入你的爱好&#xff1a;"); string aihao Console.ReadLine(); name ChangeData(name);同时在…

Legacy|电脑Windows系统如何迁移到新安装的硬盘?系统迁移详细教程!

前言 前面讲了很多很多关于安装系统、重装系统的教程。但唯独没有讲到电脑换了新的硬盘之后&#xff0c;怎么把旧系统迁移到新的硬盘上。 今天小白就来跟各位小伙伴详细唠唠&#xff1a; 开始之前需要把系统迁移的条件准备好&#xff0c;意思就是在WinPE系统下&#xff0c;可…

B004-springcloud alibaba 服务容错 Sentinel

目录 高并发带来的问题服务雪崩效应常见容错方案常见的容错思路隔离超时限流熔断降级 常见的容错组件 Sentinel入门什么是Sentinel微服务项目集成Sentinel核心库安装Sentinel控制台实现一个接口的限流 Sentinel的概念和功能基本概念重要功能 Sentinel规则流控规则三种流控模式三…

拒绝云测,热门猫主食冻干对比测评,希喂、SC、VE谁实力更强?

在当今的科学养宠时代&#xff0c;主食冻干已经成为了猫日常饮食不可或缺的一部分。高肉含量的主食冻干不仅易吸收、好消化&#xff0c;更能给猫提供其他猫粮所不能提供的微量物质&#xff0c;更满足猫的全面营养需求。然而&#xff0c;在众多品牌和口味的主食冻干中&#xff0…

抖音找人推广要给多少推广费?CloudNEO:9000+网红资源,助您品牌代言

抖音作为中国最受欢迎的短视频平台之一&#xff0c;吸引了众多用户的关注&#xff0c;也成为了企业推广的热门渠道。然而&#xff0c;很多人对于在抖音上找人推广需要支付多少推广费并不了解。下面让我们来解析一下抖音推广费用的计算方式。 1. 推广形式&#xff1a; 首先&…

ISP技术综述

原文来自技术前沿&#xff1a;ISP芯片终极进化——VP芯片&#xff08;AI视觉处理器&#xff09; 目录 1.计算机视觉的定义 2.与计算机视觉密切相关的概念与计算机视觉密切相关的概念有机器视觉&#xff0c;图像处理与分析&#xff0c;图像和视频理解。 3.计算机视觉的应用 …

[自研开源] MyData v0.7.3 更新日志

开源地址&#xff1a;gitee | github 详细介绍&#xff1a;MyData 基于 Web API 的数据集成平台 部署文档&#xff1a;用 Docker 部署 MyData 使用手册&#xff1a;MyData 使用手册 试用体验&#xff1a;https://demo.mydata.work 交流Q群&#xff1a;430089673 介绍 MyData …