算法第9章 图算法设计

7-1 旅游规划

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef pair<int,int> PII;
const int N = 510;
int g[N][N];
int n,m,s,d;
int dist[N];
int w[N],t[N][N];
bool st[N];
void dijkstra(){
memset(dist, 0x3f, sizeof dist);
dist[s] = 0;
for(int i=0;i<n;i++){int k = -1;for(int j = 0;j<n;j++)if(!st[j] && (k == -1 || dist[k] > dist[j]))k = j;st[k] = true;for(int j=0;j<n;j++){if(!st[j] && dist[j] > dist[k] + g[k][j]){dist[j] = dist[k] + g[k][j];w[j] = w[k] + t[k][j];//随时更新金额}else if(!st[j] && dist[j] == dist[k] + g[k][j] && w[j] > w[k] + t[k][j])w[j] = w[k] + t[k][j];} 
}
}
int main(){
scanf("%d%d%d%d",&n,&m,&s,&d);
memset(g, 0x3f, sizeof g);
memset(t, 0x3f, sizeof t);
for(int i=1;i<=m;i++){int a,b,c,f;scanf("%d%d%d%d",&a,&b,&c,&f);g[a][b] = c;g[b][a] = c;t[a][b] = f;t[b][a] = f;
}
//for(int i=0;i<n;i++) w[i] = t[s][i];
dijkstra();
printf("%d %d\n",dist[d],w[d]);
return 0;
}

7-2 大众情人

#include<iostream>
#include<vector>
using namespace std;
const int N = 510;
int g[N][N],sex[N],d[N];
int main()
{
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(i==j) g[i][j]=0;else g[i][j]=1e9;for(int i=1;i<=n;i++)
{char op;int k;scanf(" %c %d",&op,&k);if(op=='F') sex[i]=1;//女生 else sex[i]=2;//男生 for(int j=1;j<=k;j++){int a,b;scanf("%d:%d",&a,&b);g[i][a]=b;} 
}
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]);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(sex[i]!=sex[j])d[i]=max(d[i],g[j][i]);int d1=1e9,d2=1e9;//d1,表示男对女的距离   d2,表示女对男的距离 
for(int i=1;i<=n;i++)
{if(sex[i]==2) d1=min(d1,d[i]);//找男对女的最小距离 ,即男性的"大众情人" else d2=min(d2,d[i]);//找女对男的最小距离 ,即女性的 "大众情人" 
}vector<int> a,b;
for(int i=1;i<=n;i++)//女性的"大众情人" 
{if(sex[i]==2) continue;if(d[i]==d2) a.push_back(i);
}	for(int i=1;i<=n;i++)//男性的"大众情人" 
{if(sex[i]==1) continue;if(d[i]==d1) b.push_back(i);
}printf("%d",a[0]); 
for(int i=1;i<(int)a.size();i++) printf(" %d",a[i]);	puts("");printf("%d",b[0]); 
for(int i=1;i<(int)b.size();i++)printf(" %d",b[i]);return 0;
}

7-3 寻宝图

#include <iostream>
using namespace std;
const int MAXN=100005;
string a[MAXN];
//这里不定义二维数组以防止数组过大
int n,m;
int flag=0;
int px[]={1,0,-1,0},py[]={0,1,0,-1};
//格子控制左上右下移动
//dfs递归
void dfs(int i,int j)
{
if(i<0||i>=n||j<0||j>=m||a[i][j]=='0')return;
//该点不是1,或者i,j超出边界
if(a[i][j]>'1')flag=1;//是宝藏
a[i][j]='0';
//置该点为0
for(int k=0;k<4;k++)dfs(i+px[k],j+py[k]);
//向各个方向延申
}
int main()
{
int c=0,cnt=0;
cin>>n>>m;
for(int i=0;i<n;i++)
{cin>>a[i];
}
for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(a[i][j]>'0'){c=c+1;flag=0;dfs(i,j);if(flag)cnt++;}}
}
cout<<c<<" "<<cnt<<endl;
}

7-4 最小生成树-Prim算法(从任意顶点开始)

#include<bits/stdc++.h>
using namespace std;
int inf=0x3f3f3f3f;
int graph[10000][10000]={0};
int lowcost[10000]={0};//点集
int tree[10000]={0};
int m,n,ls;
void prim(int s)
{for(int i=1;i<=n;i++){if(i==s)lowcost[i]=0;elselowcost[i]=graph[s][i];tree[i]=s;//初始化,所有的边都待选}int minn,pos;for(int i=1;i<n;i++)//循环了n-1次,因为n个点,n-1个边{minn=inf;for(int j=1;j<=n;j++){if(lowcost[j]!=0&&lowcost[j]<minn){minn=lowcost[j];pos=j;}//这个找的就是点集周围的最小边}cout<<(tree[pos]<pos?tree[pos]:pos)<<","<<(tree[pos]>pos?tree[pos]:pos)<<","<<graph[tree[pos]][pos]<<endl;//每找到一个边就输出一个边if(minn==inf)break;lowcost[pos]=0;//加入!!for(int j=1;j<=n;j++){if(lowcost[j]!=0&&graph[pos][j]<lowcost[j])//因为没在点集里,s到j比较大,pos到j小,就更新一下{lowcost[j]=graph[pos][j];//其实就是点集到j最短的距离tree[j]=pos;//加入到tree的待选,下次循环会选出来合适的,到时候这里的j会是合适的pos,这里的pos对应上一次合适的值。}}}
}
int main()
{cin>>n>>m>>ls;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)graph[i][j]=inf;for(int i=0;i<m;i++){int a,b;cin>>a>>b;cin>>graph[a][b];graph[b][a]=graph[a][b];}prim(ls);
}

7-5 h0359. 并查集

#include <iostream>
#include <vector>using namespace std;vector<int> parent;int find(int x) {if (parent[x] == x) {return x;} else {return parent[x] = find(parent[x]);}
}void merge(int a, int b) {int rootA = find(a);int rootB = find(b);if (rootA != rootB) {parent[rootB] = rootA;}
}int main() {int n, m;cin >> n >> m;// 初始化并查集parent.resize(n + 1);for (int i = 1; i <= n; ++i) {parent[i] = i;}char op;int a, b;for (int i = 0; i < m; ++i) {cin >> op >> a >> b;if (op == 'M') {merge(a, b);} else if (op == 'Q') {if (find(a) == find(b)) {cout << "Yes" << endl;} else {cout << "No" << endl;}}}return 0;
}

7-6 h0360. 并查集2

#include <iostream>using namespace std;const int N = 100010;
int n, m;
int p[N], cnt[N];int find(int x) {if(p[x] != x) p[x] = find(p[x]);return p[x];
}int main()
{scanf("%d%d", &n, &m);for(int i = 1; i <= n; i ++ ) p[i] = i, cnt[i] = 1;while(m -- ) {char op[3];int a, b;scanf("%s", op);if(op[0] == 'C') {scanf("%d%d", &a, &b);if(find(a) == find(b)) continue;cnt[find(b)] += cnt[find(a)];p[find(a)] = find(b);} else if(op[1] == '1') {scanf("%d%d", &a, &b);if(find(a) == find(b)) printf("Yes\n");else printf("No\n");} else {scanf("%d", &a);printf("%d\n", cnt[find(a)]);}}return 0;}

7-7 h0361. 并查集3

#include<iostream>
#include<cstdio>using namespace std;
int pre[50003],rel[50003];int f(int x){if(x==pre[x])return x;int tmp=pre[x];pre[x]=f(pre[x]);rel[x]=(rel[x]+rel[tmp])%3;return pre[x];
}int link(int x,int y,int flag){int root1=f(x),root2=f(y);if(root1==root2){//表示已经合并啦if(flag!=(3-rel[x]+rel[y])%3)return 0;else return 1;}pre[root2]=root1;rel[root2]=(rel[x]+flag+3-rel[y])%3;return 1;
}int main(){int n,k,flag,x,y;scanf("%d%d",&n,&k);int ans=0;for(int i=1;i<=n;i++){pre[i]=i;rel[i]=0;}while(k--){scanf("%d%d%d",&flag,&x,&y);if(x>n||y>n){ans++;continue;}if(flag==2&&x==y){ans++;continue;}if(!link(x,y,flag-1))ans++;}printf("%d\n",ans);
}

7-8 吉利矩阵

#include<iostream>
using namespace std;
const int N=20;
int a[N][N];
int main(){
int l,n;cin>>l>>n;
a[2][2]=3;
a[2][3]=21;
a[2][4]=282;
a[3][2]=4;
a[3][3]=55;
a[3][4]=2008;
a[4][2]=5;
a[4][3]=120;
a[4][4]=10147;
a[5][2]=6;
a[5][3]=231;
a[5][4]=40176;
a[6][2]=7;
a[6][3]=406;
a[6][4]=132724;
a[7][2]=8;
a[7][3]=666;
a[7][4]=381424;
a[8][2]=9;
a[8][3]=1035;
a[8][4]=981541;
a[9][2]=10;
a[9][3]=1540;
a[9][4]=2309384;
cout<<a[l][n];
}

7-9 最小费用流

#include <iostream>
#include <vector>
#include <queue>
#include <limits>using namespace std;const int INF = numeric_limits<int>::max();struct Edge {int to, cap, cost, rev;
};vector<vector<Edge>> graph;
vector<int> dist;
vector<int> prevv, preve;void add_edge(int from, int to, int cap, int cost) {graph[from].push_back(Edge{to, cap, cost, static_cast<int>(graph[to].size())});graph[to].push_back(Edge{from, 0, -cost, static_cast<int>(graph[from].size()) - 1});
}pair<int, int> min_cost_flow(int s, int t) {int flow = 0, cost = 0;while (true) {queue<int> que;dist.assign(graph.size(), INF);dist[s] = 0;que.push(s);while (!que.empty()) {int v = que.front();que.pop();for (int i = 0; i < graph[v].size(); ++i) {Edge &e = graph[v][i];if (e.cap > 0 && dist[e.to] > dist[v] + e.cost) {dist[e.to] = dist[v] + e.cost;prevv[e.to] = v;preve[e.to] = i;que.push(e.to);}}}if (dist[t] == INF) {break;}int d = INF;for (int v = t; v != s; v = prevv[v]) {d = min(d, graph[prevv[v]][preve[v]].cap);}flow += d;cost += d * dist[t];for (int v = t; v != s; v = prevv[v]) {Edge &e = graph[prevv[v]][preve[v]];e.cap -= d;graph[v][e.rev].cap += d;}}return make_pair(flow, cost);
}int main() {int n, m;cin >> n >> m;graph.resize(n + 1);dist.resize(n + 1);prevv.resize(n + 1);preve.resize(n + 1);for (int i = 0; i < m; ++i) {int s, t, c, w;cin >> s >> t >> c >> w;add_edge(s, t, c, w);}pair<int, int> result = min_cost_flow(1, n);cout << result.first << " " << result.second << endl;return 0;
}

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

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

相关文章

C++和C语言到底有什么区别?

引言&#xff1a;C和C语言是两种非常常见的编程语言&#xff0c;由于其广泛的应用和灵活性&#xff0c;它们在计算机科学领域内受到了广泛的关注。虽然C是从C语言发展而来的&#xff0c;但是这两种语言在许多方面都有所不同。本文将对C和C语言进行比较和分析&#xff0c;以便更…

Modbus通信协议(1)--基础知识

一、基础知识 1.信息的划分 2.基本概念 3.机器数和真值 4.原码、反码与补码 5.存储单位 6.基本类型数据 7.数的浮点表示 8.各种进位制的对比 9.十进制 10.二进制 11.十六进制 12.不同进制的换算 13.位的标记 二、常用的信息编码 1.西文字符的计算机表示 2.汉字处理过程 3.汉字…

C++:列表初始化

文章目录 {}初始化std::initializer_listautodecltypenullptr {}初始化 在C98中&#xff0c;标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。比如&#xff1a; struct Point {int _x;int _y; };int main() {// 数组初始化int array1[] { 1, 2, 3, 4, 5…

如何用ai写文案?分享方法和软件!

在当今数字化时代&#xff0c;内容创作已经成为各行各业不可或缺的一部分。然而&#xff0c;对于许多创作者来说&#xff0c;如何写出既具有吸引力又符合平台特点的文案&#xff0c;却是一项不小的挑战。幸运的是&#xff0c;人工智能&#xff08;AI&#xff09;技术的快速发展…

解决使用elmessage 没有样式的问题

错误情况 这里使用了一个消息提示&#xff0c;但是没有出现正确的样式&#xff0c; 错误原因和解决方法 出现这种情况是因为&#xff0c;在全局使用了按需导入&#xff0c;而又在局部组件中导入了ElMessage组件&#xff0c;我们只需要将局部组件的import删除就可以了 import…

03试验范式V1.1

对应视频链接点击直达 01项目点击下载&#xff0c;可直接运行&#xff08;含数据库&#xff09; 03试验范式V1.1 对应视频链接点击直达当前试验情况事件分类操作方案计时误差控制分析方案 遇到的主要问题--干扰很强--有时候还能直接假死硬件嵌入式解决方案唯二解决方案 结语其…

uniapp 仿写弹窗

页面 <template><view click"close" class"mask"><view click.stop"onClick" class"content"><text class"text">点击蒙层关闭</text></view></view> </template><scr…

JDBC连接HANA

import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import com.sap.db.jdbc.Driver; public class HanaMultiTenantConnection {public static void main(String[] args) {// 数据库驱动类名String driver "com.sap.db.jdbc.Dr…

江协科技51单片机学习-0 购买套件

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记&#xff0c;在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用&#xff1a; 51单片机入门教程-2…

Blender雕刻建模_UV展开

UV展开的标准&#xff1a;展平&#xff0c;不重叠&#xff0c;均匀展开 ZenUV插件 切到边模式 -Mark&#xff0c;标记缝合边 -Unmark&#xff0c;取消标记 -Unmark All&#xff0c;全部取消标记 -Mirror Seams&#xff0c;镜像缝合边 -Zen Unwrap&#xff0c;全部展开 纹…

低代码开发平台助力企业快速响应市场需求

随着数字化转型的深入推进&#xff0c;企业对软件开发的需求日益增长。然而&#xff0c;传统的软件开发模式面临着周期长、成本高、维护难等问题&#xff0c;难以满足市场的高速变化。在这样的背景下&#xff0c;低代码开发平台应运而生&#xff0c;为企业提供了一种高效、灵活…

web端使用高德地图

web端使用高德地图 一、申请高德key和秘钥二、在项目中引入所需功能js、css文件三、实现地图选点、回显选点四、自定义地图 一、申请高德key和秘钥 申请高德key 申请成功后可以得到key 二、在项目中引入所需功能js、css文件 <script src"https://webapi.amap.com/m…

使用sersync整合rsync,实现WEB页面同步更新,亦可做数据备份之用

--> webser1[webroot] 192.168.0.16/ sersyncrsync---> webser2[webroot] 192.168.0.20192.168.0.15(/webroot&#xff09;\--> webser3[webroot] 192.168.0.8原理: 通过Linux内核的inotify 机制&#xff0c;根据源目录的变化情况&#xff0c;安排触发更新式的rsyn…

Git忽略规则(.gitignore配置)不生效原因和解决方案

Git忽略规则(.gitignore配置&#xff09;不生效原因和解决方案 Git忽略规则(.gitignore配置&#xff09;不生效原因和解决方案 重点 .gitignore中已经标明忽略的文件目录下的文件&#xff0c;git push的时候还会出现在push的目录中&#xff0c;或者用git status查看状态&…

unity2d Ugui--Image城市道路汽车行驶

目录 1.车辆生成与回收 2.路径点控制 3.车辆控制 1.车辆生成与回收 using System.Collections.Generic; using UnityEngine;public class RoadContr : MonoBehaviour {public WayPoint[] wayPoints; //出生点public Transform pare;[SerializeField]private Car[] fabCar;pu…

node调试

vscode安装插件&#xff1a;JavaScript Debugger (Nightly) 点击后生成一个launch.json文件 打断点&#xff0c;并发送一个请求来执行代码到断点处 按右上的向下箭头&#xff0c;进入源码&#xff0c;进行查看&#xff0c;左边查看变量等值

IDEA创建简单web(servlet)项目(server为tomcat)

引言 鉴于网上很少有关于IDEA开发servlet项目的教程&#xff08;24版idea&#xff0c;并且servlet技术十分复古&#xff0c;很少有人用到&#xff0c;能够理解&#xff0c;该文章旨在为在校的学生提供一个参考&#xff0c;项目技术简单&#xff09;本人在此总结从头开始到项目…

哪个牌子的儿童护眼灯好?五款平价护眼台灯推荐

护眼台灯在近年来成为家长和长时间使用电子设备人群关注的家电/学生产品。对于家中有孩子或经常面对电子屏幕的人士来说&#xff0c;很多人可能已经对这类产品有所了解并进行了购买。然而&#xff0c;部分家长对护眼台灯的认识还不够深入&#xff0c;因此尚未为孩子选择一款合适…

无公网IP与服务器完成企业微信网页应用开发远程调试详细流程

文章目录 前言1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 前言 本文主要介绍如何在企业微信开发者中心通过使用内网穿透工具提供的公网域名成功验证回调本地接口服务! …

postman教程-21-Newman运行集合生成测试报告

上一小节我们Postman Newman的安装方法&#xff0c;本小节我们讲解一下Postman Newman的具体使用方法。 使用Newman运行集合 1、导出Postman集合&#xff1a; 在Postman中&#xff0c;选择你想要运行的集合&#xff0c;然后点击“导出”按钮&#xff0c;选择导出为“Collect…