迪杰斯特拉派初赛赛题

最强大脑中的收官蜂巢迷宫变态级挑战,相信大家都叹为观止!最强大脑收官战打响后,收视率节节攀升,就连蚁后也不时出题难为一下她的子民们。在动物世界中,称得上活地图的,除了蜜蜂,蚂蚁当仁不让。在复杂多变的蚁巢中, 蚂蚁总是能以最快、最高效的方式游历在各个储藏间(存储食物)。今天,她看完最新一期节目,又发布了一项新任务:小蚁同学,我需要玉米库的玉米,再要配点水果,去帮我找来吧。小蚁正准备出发,蚁后又说:哎呀,回来,我还没说完呢,还有若干要求如下:
1.小蚁同学,你需要尽可能以最少的花费拿到食物(附件图中路线上的数值表示每两个储物间的花费);
2.小蚁同学,你最多只能经过9个储藏间拿到食物(包含起止两个节点,多次通过同一节点按重复次数计算);
3.小蚁同学,你必须经过玉米间,水果间(附件图中标绿色节点);
4.别忘了,食蚁兽也在路上活动呢,一旦与食蚁兽相遇,性命危矣!不过小蚁微信群公告已经公布了敌人信息(附件图中标红色路段);
5.最后,千万别忘了,还有两段路是必须经过的,那里有我准备的神秘礼物等着你呢(附件图中标绿色路段)。
这下小蚁犯难了,这和它们平时找食物的集体活动规则不一样嘛,看来这次需要单独行动了。要怎么选路呢?小蚁经过一番苦思冥想,稿纸堆了一摞,啊,终于找到了!亲爱的同学们,你们能否也设计一种通用的路径搜索算法,来应对各种搜索限制条件,找到一条最优路径,顺利完成蚁后布置的任务呢?
注:
1、蚁巢,有若干个储藏间,储藏间之间有诸多路可以到达;
2、节点本身通行无花费;
3、该图为无向图,可以正反两方向通行,两方向都会计费,并且花费相同;
4、起止节点分别为附件图中S点和E点。
5、最优路径:即满足限制条件的路径。

图片附在代码下面了,我的解决方案是对整个图进行一个限制路径的dij,用一个set来判断特殊点的个数,之后对特殊情况进行判断一下就行了。这个解法主要的优点是通用,的确牺牲了一下次优解的情况,只有70分,没拿到区域优胜有点可惜。顺便帮助队友拿到数模校赛一等奖(题目一样)

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxnum = 100;
const int maxint = 999999;int dist[maxnum];         //initialize with maxint
int prev[maxnum];
int c[maxnum][maxnum];   //initialize with maxint
int n, line;             // 图的结点数和路径数
set<int> sp_nodes;
bool sp_edge[maxnum][maxnum];
// n -- n nodes
// v -- the source node
// dist[] -- the distance from the ith node to the source node
// prev[] -- the previous node of the ith node
// c[][] -- every two nodes' distance
inline long long fac(int n)
{int res=1;while(n!=0){res*=n;n--;}return res;
}
void Dijkstra_modify(int n, int v)
{bool s[maxnum];for(int i=0; i<n; i++){dist[i] = maxint;}for(int i=0; i<n; ++i){dist[i] = c[v][i];s[i] = 0;                         if(dist[i] == maxint)prev[i] = 0;elseprev[i] = v;}dist[v] = 0;s[v] = 1;for(int i=1; i<n; ++i){int tmp = maxint;int u = v;for(int j=0; j<n; ++j){if((!s[j]) && dist[j]<tmp){u = j;              tmp = dist[j];}// let the special nodes and the current point's edge minimum// but if there are mutiple of special node ?}s[u] = 1;// refresh extend// no need to changefor(int j=0; j<n; ++j)if((!s[j]) && c[u][j]<maxint){int newdist = dist[u] + c[u][j];if(newdist < dist[j]){dist[j] = newdist;prev[j] = u;}}}
}
void print(int x,int s)
{stack<int>q;int flag(s);while(x!=s){q.push(x);x=prev[x];}q.push(s);while(q.empty()==0){cout<<q.top()<<"->";q.pop();}cout<<"\n";
}int main()
{freopen("graph_in.txt","r",stdin);freopen("graph_out.txt","w",stdout);int t1= 0,t2=0,t3=0;int st_node,tm_node;cin>>n>>line;for(int i=0; i<=n; i++){dist[i]=maxint;for(int j=0; j<=n; j++){c[i][j]=maxint;}}for(int i=0; i<line; i++){cin>>t1>>t2>>t3;c[t1][t2] = c[t2][t1] = t3;}//cin>>st_node>>tm_node;for(int i=0; i<2; i++){cin>>t1;sp_nodes.insert(t1);}for(int i=0; i<2; i++){cin>>t1>>t2;sp_nodes.insert(t1);sp_nodes.insert(t2);sp_edge[t1][t2] = sp_edge[t2][t1] = true;}//edge that unreachablecin>>t1>>t2;c[t1][t2] = c[t2][t1] = maxint;//beginvector<int> path,path_p;vector<int> sp_nodes_p;int cnt=0;int ans=maxint;int cnt_nodes=0;for(set<int>::iterator sit = sp_nodes.begin(); sit!=sp_nodes.end(); sit++){sp_nodes_p.push_back(*sit);}int times=fac(sp_nodes.size());for(int i=0; i<times; i++){//generate the permutationnext_permutation(sp_nodes_p.begin(),sp_nodes_p.end());path_p.clear();vector<int>::iterator it = sp_nodes_p.begin();Dijkstra_modify(n,st_node);cnt += dist[*it];path.push_back(*it);//cout<<"st: "<<cnt<<endl;bool sp_edge_p[maxnum][maxnum];memcpy(sp_edge_p,sp_edge,sizeof(sp_edge_p));bool flag = true;while(1){int tmp=*it;it++;if(it==sp_nodes_p.end()){break;}if(sp_edge_p[tmp][*it]){//cout<<"hit : "<<tmp<<"->"<<*it<<" ";sp_edge_p[*it][tmp] = false;//refresh the tempcnt += c[tmp][*it];//cout<<c[tmp][*it]<<endl;path_p.push_back(tmp);path_p.push_back(*it);}else{for(int j=0; j<n; j++){if(sp_edge_p[tmp][j]){flag = false;break;}}if(!flag){break;}Dijkstra_modify(n,tmp);cnt += dist[*it];//refresh the temp//cout<<"short : "<<tmp<<"->"<<*it<<" : ";//print(*it,tmp);stack<int> q;int tmp2=*it;while(tmp2!=tmp){q.push(tmp2);tmp2=prev[tmp2];}while(q.empty()==0){path_p.push_back(q.top());q.pop();}//cout<<dist[*it]<<endl;}}if(!flag){//cout<<"pass"<<endl;cnt=0;continue;}int e=sp_nodes_p[sp_nodes_p.size()-1];Dijkstra_modify(n,e);cnt+=dist[tm_node];//cout<<"Path :";int judge=st_node;//cout<<tm_node<<endl;//cout<<"tm :"<<dist[tm_node]<<endl;if(ans > cnt){path.clear();ans = cnt;for(vector<int>::iterator pit =path_p.begin(); pit!=path_p.end(); pit++){if(judge == *pit) continue;judge=*pit;path.push_back(*pit);}cnt_nodes=path.size();}cnt=0;}cout<<"distance :"<<ans<<endl;int judge = st_node;cout<<"path :"<<st_node<<"->";for(int i=0; i<cnt_nodes; i++){if(judge == path[i]) continue;cout<<path[i]<<"->";judge=path[i];}cout<<tm_node<<endl;if(cnt_nodes>6){cout<<"No optimal solution"<<endl;}else{cout<<"The optimal solution:"<<endl;}cout<<"number of nodes :"<<cnt_nodes+2<<endl;return 0;
}

第一届中兴捧月算法大赛迪杰斯特拉派解决方案相关推荐

  1. 2020中兴捧月算法大赛-阿尔法(MOT)赛道--赛后总结

    比赛结束了,很荣幸拿到了中兴捧月算法大赛 MOT赛道 全国总决赛第二名的亚军奖杯,这估计也是我找到工作前最后一个比赛了,收获满满,下面算是自己给自己写的一个简单的赛后总结,做的比较粗糙,细节也就不多赘 ...

  2. 2019中兴捧月算法大赛历程

    1.初赛 题目是网络流量均衡.再带宽限制的图中求不同请求带宽的各条业务的最短路径使总成本最小. 解题思路: 对业务进行排序,优先级高的业务去走热点链路,优先级低的业务发现热点链路已经达到带宽上限就绕路 ...

  3. 2020年中兴捧月算法大赛---埃德加考特派赛题解析及代码

    写在前面 三月份疫情期间在家闲来无事, 各大公司举办了很多的算法比赛, 但是大多是人工智能相关, 而我这个菜鸡又不会这方面的, 这时发现了中兴捧月的埃德加考特派赛道, 也就是数据库相关本科课设, 恰好 ...

  4. 2017年中兴算法大赛 迪杰特斯拉派

    总结:本人2017年参加的比赛,对于初次参加算法大赛的作者来说,异常激动又有点小窃喜,最后在赛区拿到24名的名次,名次不算高,但是对于一步步解决问题过来的我,经验与经历更为重要,再次做一个小小的总结, ...

  5. 2020中兴捧月算法大赛阿尔法赛道决赛总结(多目标检测与跟踪)

    赛题:多目标检测与跟踪 代码地址 初赛:排名第1 初赛思路:第一次做跟踪任务.简单的认为是检测+reid问题. 初赛: 1.首先明确题意:多目标跟踪:指标MOTA和MOTP, 后期的大量实验证明检测算 ...

  6. 2020中兴捧月算法赛道傅里叶派赛题菜鸡回顾

    最近抱着试水的心理参加了2020中兴捧月算法大赛傅里叶派赛题.从4.19号由旁观者转变为参赛者,到5.8号提交完成最后的文档和代码,前后算起来也有20天了.虽然自己比较菜,但毕竟是第一次参加这种比较正 ...

  7. 2023第十三届“中兴捧月”全球精英挑战赛今日正式启动

    3月31日,第十三届"中兴捧月"全球精英挑战赛正式启动! 由中兴通讯主办的"中兴捧月"大赛,自2009年首次举办至今,已走过13个年头,是广大高校师生的重点关注 ...

  8. [转]最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现

    最短路径算法-Dijkstra(迪杰斯特拉)算法分析与实现(C/C++) Dijkstra算法 ----------- 最后更新时间:2011.9.25 ----------- Dijkstra(迪杰 ...

  9. 图 相关算法~从头学算法【广搜、 深搜、 拓扑排序、 并查集、 弗洛伊德算法、迪杰斯特拉算法】

    图的相关主流算法主要有: 广度优先搜索 深度优先搜索 拓扑排序 并查集 多源最短路径(弗洛伊德算法) 单源最短路径(迪杰斯特拉算法) 其中呢,最基本的是前两种,也就是平时常用的广搜和深搜,本文中将概要 ...

最新文章

  1. v-vim 代码批量缩进,字符串精确查找及替换
  2. Unix Domain Socket 域套接字实现
  3. R语言观察日志(part22)--glmnet包
  4. @Inner使用及原理
  5. 梭织布印染后整理瑕疵最全解读
  6. 如何设置ubuntu的PATH环境变量
  7. [UVA1374]Power Calculus【迭代加深】
  8. 网络专业人员需要了解的物联网信息
  9. winrar大全+压缩
  10. 个人发卡网站源码运营版 内置4套模板
  11. (9)数据分析-相关性分析
  12. swiper 切换时间_改变Swiper切换和animate.js动画的时间曲线
  13. linux没有无线wifi密码忘记,新版tplink无线密码(wifi密码)忘记了怎么办?
  14. 七夕节送女朋友什么礼物最好、七夕最走心的礼物清单
  15. 阅读笔记-平凡的世界
  16. Scratch:变量与抛物线
  17. background-clip和background-origin
  18. 机器学习和深度学习之数学基础-线性代数 第一节 向量及线性映射
  19. python项目练习
  20. Real6410移植linux-2.6.39.1记录(1)-启动cramfs根文件系统

热门文章

  1. WP博客几款好看的图片类模板分享
  2. macbook电脑如何通过ssh连接群晖nas?
  3. 4G模组EC20在使用电信物联网专用卡时无信号问题
  4. linux内核模块Makefile的解析
  5. Postgresql 之 数据库认证
  6. CAD三维图形转化成二维图形的过程具体的步骤
  7. Ubuntu20.04+GTX1060+显卡驱动+CUDA11.8+cuDNN8.5.0
  8. ESP32 C3 使用ConfigWiFi配网
  9. 移动终端应用开发上机3组件通信与广播
  10. Openstack Kilo安装错误汇总