#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<string>
using namespace std;
const int MAXN = 105;
const int INF = 1e9;
struct Bridge {string address;//该网桥地址vector<int> interface;//该网桥连接的接口int v, time;//v-目的网桥 time-时间花费Bridge(string s,int a, int b, vector<int> c) :address(s),v(a), time(b), interface(c) {}//初始化
};
vector<Bridge> G[MAXN];//邻接矩阵存储网桥结构struct Table {//转发表bool flag = false;//是否已查询int minTime = INF;//最短时间vector<int> path;//最优路径
};
map<pair<char, char>, Table> SendTable;//map存储转发表map<char, int> site;//站点对应的接口
map<int, int> inter;//接口对应的网桥
int n, m;//n个网桥 m个接口bool vis[MAXN];
int dd[MAXN], pre[MAXN];
void Dijkstra(int s, int t) {//Dijkstra 求s到t最短路径fill(dd, dd + MAXN, INF);fill(vis, vis + MAXN, false);dd[s] = 0;for (int i = 1; i <= n; i++) {int u = -1, MIN = INF;for (int j = 1; j <= n; j++) {if (!vis[j] && dd[j] < MIN) {u = j;MIN = dd[j];}}if (u == -1) return;vis[u] = true;for (int j = 0; j < G[u].size(); j++) {int v = G[u][j].v;if (!vis[v]) {if (dd[u] + G[u][j].time <= dd[v]) {dd[v] = dd[u] + G[u][j].time;pre[v] = u;}}}}
}vector<int> Path;
void DFS(int now,int s) {if (now == s) {Path.push_back(s);return;}DFS(pre[now], s);Path.push_back(now);
}int d[100][MAXN];//d[i],以第i个网桥为起点到各网桥的最短时间花费路径
int prim(int start) {//最小生成树-prim算法fill(d[start], d[start] + MAXN, INF);fill(vis, vis + MAXN, false);d[start][start] = 0;int ans = 0;//遍历总网桥的最小花费for (int i = 1; i <= n; i++) {int u = -1, MIN = INF;for (int j = 1; j <= n; j++) {if (!vis[j] && d[start][j] < MIN) {u = j;MIN = d[start][j];}}if (u == -1) return -1;vis[u] = true;ans += d[start][u];for (int j = 0; j < G[u].size(); j++) {int v = G[u][j].v;if (!vis[v] && G[u][j].time < d[start][v]) {d[start][v] = G[u][j].time;}}}return ans;
}int main() {cout << "网桥数和接口数:" << endl;cin >> n >> m;for (int i = 1; i <= n; i++) {int IterNum, LinkNum;//IterNum-网桥接口数,LinkNum-连通网桥数vector<int> c;string str;cout << "输入网桥" << i << "地址、接口数及连通情况:" << endl;cin >> str >> IterNum;for (int j = 1; j <= IterNum; j++) {//接口输入int t;cin >> t;c.push_back(t);inter[t] = i;}cin >> LinkNum;for (int j = 1; j <= LinkNum; j++) {//连通网桥输入int v, time;cin >> v >> time;G[i].push_back(Bridge(str, v, time, c));G[v].push_back(Bridge(str, i, time, c));}}cout << "输入各站点对应的接口" << endl;for (int i = 1; i <= m; i++) {int siteNum;cin >> siteNum;while (siteNum--) {char t;cin >> t;site[t] = i;}}while (true) {int s, t;char s1, t1;cout << "输入起始站点和目的站点:" << endl;cin >> s1 >> t1;Table tab;pair<char, char> p(s1, t1);s = inter[site[s1]];t = inter[site[t1]];Path.clear();if (SendTable[p].flag) {//若查询过,已有结果,直接输出if (SendTable[p].minTime == 0) {cout << "两站点在同一网桥:" << s << endl;}else {cout << "最短时间=" << SendTable[p].minTime << endl;cout << "网桥路径为:" << endl << SendTable[p].path[0];for (int i = 1; i < SendTable[p].path.size(); i++) {cout << "->" << SendTable[p].path[i];if (Path[i] == t) break;}cout << endl;}}else {tab.flag = true;//若为第一次查询,标记查询if (s == t) {cout << "两站点在同一网桥:" << s << endl;dd[t] = 0;}else {cout << "该站点所在网桥分别为:" << s << " " << t << endl;Dijkstra(s, t);DFS(t, s);if (dd[t] == INF) cout << "无法到达" << endl;else {cout << "最短时间=" << dd[t] << endl;cout << "网桥路径为:" << endl <<Path[0];for (int i = 1; i < Path.size(); i++) {cout << "->" << Path[i];if (Path[i] == t) break;}cout << endl;}}tab.minTime = dd[t];tab.path = Path;SendTable[p] = tab;}}int ans;//求最小生成树遍历所有网桥的代价for (int i = 1; i <= n; i++) {ans = prim(i);}if (ans == -1) cout << "网桥非连通!" << endl;else cout << ans << endl;return 0;
}
/*
4 9
hanzhuan 2 1 2 1 2 1
jiaxuwen 2 3 4 1 3 2
fight 3 5 6 7 1 4 3
hello 2 8 9 1 5 32 a b
2 c d
3 e f g
1 h
3 i j k
1 l
2 m n
2 o p
1 q
*//*
第一个网桥有2个接口1和2 1个连通网桥2 时间花费为1
第二个网桥有两个接口3和4 1个连通网桥3 时间花费为2
第三个网桥有三个接口5和6和7 1个连通网桥4 时间花费为3
第四个网桥有两个接口8和9 1个连通网桥5 时间花费为3
*/

计算机网络——透明网桥算法相关推荐

  1. 计算机网络透明网桥的算法,网基课程设计曼切斯特编码模拟透明网桥自习域转发帧算法模拟IP分片模拟.doc...

    网基课程设计曼切斯特编码模拟透明网桥自习域转发帧算法模拟IP分片模拟 计算机网络基础 课 程 设 计 报 告 学号: 姓名: 班级: 题号:01.06.07 题目:曼切斯特编码模拟.透明网桥自学习域转 ...

  2. Python3 透明网桥算法

    import time#定义网桥1 b1 = {}port_list1 = [1, 2]#主机列表 L1 = ['a','b','c']L2 = ['d','e']L = [L1,L2]def get ...

  3. 直接广播地址_计算机网络之网桥、冲突域、广播域是什么?

    网桥(Bridge)又称为桥接器.和中继器类似,传统的网桥只有两个端口,用于连接不同的网段.和中继器不同的是,网桥具有一定的"智能"性,可以"学习"网络上主机的 ...

  4. 配置透明网桥实现QinQ传输案例

    拓扑图 规格 对于V200R008C20及更低版本,只有AR100&AR120&AR150&AR160&AR200系列支持该示例. 对于V200R008C30及更高版本 ...

  5. 去掉图片黑背景输出为透明png(算法和工具)

    去掉图片黑背景输出为透明png(算法和工具) 有时候你得到的图片不是透明的png而是加了黑背景的图(可能是:.jpg,.gif,.png等格式的图) 例如一个粒子效果的图: 多好的粒子效果,可惜它有黑 ...

  6. 计算机网络之Nagle算法与延迟确认

    文章目录 计算机网络之Nagle算法与延迟确认 1.Nagle算法 2.延迟确认 计算机网络之Nagle算法与延迟确认 1.Nagle算法 如果发送方疯狂地向接收方发送很小的数据包,比如一次就发送 1 ...

  7. 网桥工作在计算机网络的,网桥的作用和工作原理是什么

    网络像一个巨大的蜘蛛网,连接着我们每个人的生活.对于网络,我们看不见也摸不着,但是却离不开它.无形的网络到底是怎么运作的呢?我们是如何通过网络实现人与人之间的交流的呢?今天小编就给大家普及一下网桥的知 ...

  8. 计算机网络 洪泛算法,泛洪

    泛洪(Flooding)是交换机和网桥使用的一种数据流传递技术,将从某个接口收到的数据流向除该接口之外的所有接口发送出去 中文名 泛洪 外文名 Flooding适用范围 交换机和网桥 领    域 信 ...

  9. 计算机网络二进制反码求和校验算法

    原文链接:http://blog.chinaunix.net/uid-26758209-id-3146230.html 校验和算法 经常看计算机网络相关的书时,每次看到关于IP或者是UDP报头校验和时 ...

  10. iptables透明网桥无法使用透明代理错误

    环境:squid,第三方过滤产品 要求:配置网桥,过滤用户的访问需求 问题:用户通过代理能被过滤,但是清除代理设置时,无法过滤. 分析:问题应该是出在iptables上,套用之前的脚本时没把我指定的端 ...

最新文章

  1. ef mysql 插件_EF Core 插件 —— ToSql
  2. VS2017使用过程中得到的一些技巧方法和注意点
  3. 神经风格迁移(Neural Style Transfer)程序实现(Keras)
  4. 牛客 contest893 G-Truthman or Fakeman
  5. matlab均线程序化交易,【策略分享】Matlab量化交易策略源码分享
  6. LeetCode 1784. 检查二进制字符串字段
  7. 计算机网络实验vc6实现串口通信,用vc的串口通信实验报告.docx
  8. jquery实现输入框动态增减的实例代码
  9. Python小数据保存,有多少中分类?不妨看看他们的类比与推荐方案...
  10. 关于计算机组件游戏,Windows系统运行库/游戏运行库组件怎么补全?
  11. PowerDesigner中Table视图同时显示Code和Name
  12. 用python来部署远程程序
  13. java图像预处理_图像预处理(一)基本特征提取
  14. 什么样的项目算是成功的?项目目标有什么特点?
  15. CodeVS2505 上学路线
  16. #Sam有话说#人以群分,共性与个性的智慧
  17. JAVA学习资源种子
  18. django html菜单,使用Django模板的导航菜单
  19. python中“羊车门问题”的简单分析与代码实现
  20. 产品经理必知的2020年手机 App 7大原型设计流行趋势

热门文章

  1. [生存志] 第26节 历代大事件概览 明朝
  2. WIN7 通过4G模块 拨号上网过程
  3. .Net 调用中国气象台Web Service
  4. VLIW的前世今生:为什么DL加速器都青睐于它
  5. 【等保测评】等保测评师怎么考,前景怎么样?
  6. jQuery计算时间差和阴阳历转换
  7. js实现查找删除功能
  8. word表格中多行只有一行字,让一行字居中的设置操作
  9. c语言程序设计的删除函数,详解C语言中的rename()函数和remove()函数的使用方法
  10. 读取jpeg图像数据