算法分析:

分析题目得,应当得到k个结点的dist数组,从这k个数组中可以得知,k个结点中的某个结点A到另一个结点B的路径长度(这条路径中间可能经过k个结点中的第三个结点,我们不去关心他,只抽象为一条从结点A到结点B的一条通路)。之后对k个结点进行全排列决定信号的传递顺序(同上,中间可能从A到B时经过C ,不关心这中间的C),然后计算path总长,对所有的顺序序列进行搜索比较出最短的即可。
也即,此题的精髓便是k次Dijkstra(不用Floyd是因为O(V3)的复杂度必超时)+枚举搜索(path序列进行全排列)

Debug记录:

见代码注释

题目

题目描述
网络的高效互联与智能传输是提升海量用户服务请求映射效率的重要措施。在这个任务中,你要用最少的传输时间,将特定的数据源发送到指定的网络节点中。
我么给定的网络一共包含N个节点(从1到N编号),其中节点1为数据源。网络中有M条无向边(u,v,w),表示一条传输线连接节点u和节点v,且数据通过这条传输线的平均时间为w。由于传送机制的限制,当一个节点接收到数据之后,它只能选择与它互连的一个节点,并将数据转发到该节点。节点1在初始化时只会发送一次数据,但在传输过程中它可以作为转发节点。
网络中有k个目标节点,你需要计算出该数据从节点1传送到所有K歌节点所需要的最短时间。注意目标节点可以按任意顺序进行传送,数据也可以多次经过同一节点。
输入格式
输入数据第一行是一个整数T(T<=5),表示测试数据的组数。
对于每组测试数据:
第一行是三个正整数N,M,K(2<=N<=1000,1<=M<=N(N-1)/2,K<=10),分别表示节点数,边数和目标节点数。
接下来M行,每行三个整数u,v,w(1<=u,v<=N, 0<=w<=1000,u!=v)。如上所述给出每条传输线。任意两个网络节点之间最多只会有一条边相连。
最后一行是K个整数,给出所有的目标节点的编号,所有目标节点的编号都在2到N之间。
输出格式
对于每组测试数据,输出数据传送到所有K个目标节点的最短时间。
样例输入
2
3 2 2
1 3 1
1 2 3
2 3
6 6 4
1 5 1
5 6 2
2 1 20
2 3 5
3 4 5
6 3 1
2 3 4 6
样例输出
5
19
样例说明
在第一组样例中,最短路线是:1->3->1->2
在第二组样例中,最短路线是:1->5->6->3->2->3->4,或者1->5->6->3->4->3->2

//适用于有向图
//若是无向图,将/*无向图*/处注释取消即可
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#define MAXSIZE 1010
#define INF 0x7fffffff
using namespace std;
struct Edge{int end;double weight;Edge(){}Edge(int end,double weight){this->end=end;this->weight=weight;}bool operator<(const Edge e){//uselessreturn weight<e.weight;}
}; struct Graph{ //顶点下标从0开始 int graphSize;vector<Edge> edge[MAXSIZE];//edgeListint dist[MAXSIZE][MAXSIZE];int initGraph(int graphSize){this->graphSize=graphSize;for (int i=0;i<graphSize;i++)edge[i].clear();//以下对dist[]的初始化可能带来大量的时间开销 ,若不需要请删除或简化 for (int i=0;i<graphSize;i++){for (int j=0;j<graphSize;j++){dist[i][j]=-1;}}for (int i=0;i<graphSize;i++){dist[i][i]=0;}}void Dijkstra(int origin){//declare bool mark[MAXSIZE];int newPoint,minDistVex;int temp;//initiate for (int i=0;i<graphSize;i++){mark[i]=false;dist[origin][i]=-1;}newPoint=origin;        //originate x 求x结点到其他所有结点的最短路径 mark[newPoint]=true;dist[origin][newPoint]=0;//processfor (int time=0;time<graphSize-1;time++){//每趟循环找出x到一个结点的最短路径,共n-1趟 //遍历newPoint直接相邻的结点,修改其distfor (int i=0;i<edge[newPoint].size();i++){int end=edge[newPoint][i].end;if (mark[end]==true)//if end结点已经在x集合中,则跳过此次循环 continue;temp=dist[origin][newPoint]+edge[newPoint][i].weight;if (temp<dist[origin][end]||dist[origin][end]==-1) //if the new dist< the old distdist[origin][end]=temp;}//遍历dist,从mark为false的结点中找出其dist最小的结点,确定为新的newPoint,并加入x集合 int i;for (i=0;i<graphSize;i++){//initiate minDistVexif (mark[i]==false&&dist[origin][i]!=-1){minDistVex=i;break;}}for (i++;i<graphSize;i++){if (mark[i]==false&&dist[origin][i]!=-1&&dist[origin][i]<dist[origin][minDistVex])minDistVex=i;} newPoint=minDistVex;mark[minDistVex]=true;} }
};
int main(){int t,n,m,k;//求origin到各节点的dist Graph graph;int origin,start,end,weight;int path[10];int tempPath,shortestPath;cin>>t;while (t--){//n vexes ,m edges//initiatecin>>n>>m>>k;origin=0;//当题设的结点下标从0开始时,做调整 graph.initGraph(n);//input edgefor (int i=0;i<m;i++){cin>>start>>end>>weight;start--;end--;//当题设的结点下标从0开始时,做调整 graph.edge[start].push_back(Edge(end,weight));graph.edge[end].push_back(Edge(start,weight));}for (int i=0;i<k;i++){cin>>path[i];path[i]--;//adjust}sort(path,path+k);//Dijkstragraph.Dijkstra(0);/*忘记做0结点的Dijkstra*/for (int i=0;i<k;i++){graph.Dijkstra(path[i]);}//calshortestPath=INF;do{tempPath=graph.dist[0][path[0]];if (tempPath==-1)continue;//tempPath=INF,即进入下一趟while for (int i=0;i<k-1;i++){if (graph.dist[path[i]][path[i+1]]==-1){tempPath=INF;/*bug:没有考虑到此路不通的情况*/break;} tempPath+=graph.dist[path[i]][path[i+1]];}//debug
//          cout<<tempPath<<endl;//*****if (tempPath<shortestPath){shortestPath=tempPath;}} while (next_permutation(path,path+k));//outputcout<<shortestPath<<endl;   }return true;
}

北邮OJ-269. 网络传输-14网研上机D相关推荐

  1. 校外如何登陆北邮oj

    由于北邮oj不对外开放,准备复试的我需要进入北邮oj:其他小朋友也有这个想法.故写此博客. 先找北邮土著借北邮账号,包括一些认识的同学,直系学长学姐,他们都很乐意帮助的~ 下面是校外进北邮校内网的方法 ...

  2. 北邮oj题库刷题计划(更新ing)

    北邮oj题库刷题计划(更新ing) 83. A + B Problem 84 Single Number 85. Three Points On A Line 120 日期 121 最值问题 122 ...

  3. 北邮OJ 141 虚数

    北邮OJ 虚数 #include <bits/stdc++.h> using namespace std; typedef struct fushu{int x; //实部 int y; ...

  4. 计算机考研大学排行榜,2020计算机研究生院校最新排名:武大3,北邮10,杭电14,复旦24...

    2020计算机研究生院校最新排名:武大3,北邮10,杭电14,复旦24 2019考研还剩下不到半个月时间了,各位考研党都在加紧复习做最后的冲刺,考研对很多本科生来说已经是一道迈不过的槛了,小编身边很多 ...

  5. 2014北邮网研上机试题D

    目录 Problem D 网络传输 题目描述 输入格式 输出格式 思路 代码 积累知识 oj提交链接 Problem D 网络传输 题目描述 网络的高效互联与智能传输是提升海量用户服务请求映射效率的重 ...

  6. 北邮计算机实习网络爬虫设计报告,北邮计算机实习报告(含代码).doc

    北邮计算机实习报告(含代码) 计算机实习报告 学院: 班级: 学号 序号: 姓名: 目录 一.魔方阵4 1.实验要求4 2.设计4 3.流程图4 4.功能实现5 5.应用5 6.界面5 二.动画设计6 ...

  7. 2012年北邮网研上机

    //2012年北邮网研院机试 A //2018/3/2 //by ben yafang #include<stdio.h> #include<string.h> int mai ...

  8. 北邮OJ-91. 文件系统-13网研上机D

    典型的树结构.各种先序遍历就能解决,只是符合北邮一贯的尿性--难度不大就是量巨多,题目就能写两页,神烦 题目描述 现在很多操作系统的文件系统都是基于树形结构设计的.即一个目录下可以有若干个目录和文件, ...

  9. 2014年网研上机题目

    思路:通分,上下同除个指数小的,求上下的最大公约数,上下除最大公约数即可.代码如下: #include<stdio.h> #include<math.h>int gcd(int ...

最新文章

  1. 【DIY】废物利用,最简单粗暴便宜的DIY定时器方法,没有之一
  2. 学习nginx接口调用之摘录
  3. HTTP1.1中CHUNKED编码解析(转载)
  4. c语言中的*和运算符*,C语言中的运算和运算符
  5. 数据仓库 和挖掘的步骤 - oracle
  6. 设置log缓存_全局变量、事件绑定、缓存爆炸?Node.js内存泄漏问题分析
  7. JavaScript 中的垃圾回收和内存泄露如何处理?| 技术头条
  8. IEEE Signal Processing Letters
  9. 考研 英语一 大作文-图画作文 (二)---第二段写作攻略
  10. 常见显示器PPI备忘
  11. d3.js 旋转图形_凭布青云拼布图形设计软件下载-布艺设计软件 v2.0.0.1 官方版
  12. linux下mysql命令大全_linux下mysql命令大全
  13. 约翰·库缇斯(没有双腿的激励大师,年轻人必看)转载
  14. java uint64_Java 中的 uint64
  15. 微信缓存怎么解决,看这儿
  16. win10的word如何取消分页符
  17. 智能手表的突破和新发展机遇
  18. linux下Git代理设置
  19. CAD与3D建模软件:有什么区别?
  20. Android唤醒、解锁屏幕代码实例

热门文章

  1. 利用turtle绘制五角星
  2. 【模拟电子技术Analog Electronics Technology 4】——晶体三极管工作原理及放大作用详解
  3. MAC10.15.4无法开启ToDesk屏幕录制权限
  4. java根据模板导出pdf,并将多个pdf合成一个
  5. github上star最多的抢火车票软件教程
  6. 未明学院活动:新零售热门背景提升项目上线,阿里、腾讯都看重的项目经历,你来不来?
  7. java jtextfield 透明_java – 使JTextField背景透明
  8. 新闻丨“爆款“企业级区块链云服务平台专家评审 智链ChainNova为何深藏不露
  9. 淘宝npm镜像源换新地址
  10. 动态规划练习一 17:开餐馆