1937. 导游
来源:互联网 发布:爱淘宝网商城 编辑:程序博客网 时间:2024/04/27 19:57
一看就是dijkstra算法的变形了。
但是还是要强调的是:
1)用邻接矩阵来表达图的时候,初始化,选择,更改的目的点都是i或者j,循环是对所有的顶点循环
2)用邻接表来表达图的时候,初始化,更改的时候是对目的链来操作,操作点位v[k][j].end,循环也是对链来循环。这个很容易错,我就把d[v[k][j].end]写成了d[j]或d[v[k][j].cost]
注意在传统的dijkstra中用邻接矩阵来求最短路径的时候还一定要注意松弛操作,初始化。最常用的无非是0x3f3f3f3f了。
而返回一般是遇到目的点就返回!(有待验证)
邻接表来解答
#include <iostream>#include <cstring>#include <vector>#include <cmath>using namespace std;const int maxn = 110;int NumVex,NumEdge;int vis[maxn];int dis[maxn];int start,_end,NumPeople;struct edge { int end,cost; edge(int _end=0,int _cost=0):end(_end),cost(_cost){}};vector<edge> v[maxn];int f() { for (int i=0;i<v[start].size();i++) { dis[v[start][i].end] = v[start][i].cost; } for (int i=0;i<NumVex-1;i++) { int tmp = -1,k; for (int j=1;j<=NumVex;j++) {if(!vis[j]&&tmp<dis[j]) {tmp = dis[j];k = j;}} vis[k] = 1; if (k== _end) return tmp; for (int j=0;j<v[k].size();j++) { if(!vis[v[k][j].end]) { int t = min(v[k][j].cost,dis[k]); dis[v[k][j].end] = max(dis[v[k][j].end],t); } } } return dis[_end];}int main() { int t; cin>>t; while(t--) { cin>>NumVex>>NumEdge; for(int i=1;i<=NumVex;i++) v[i].clear(); for(int i=1;i<=NumEdge;i++) { int a,b,c; cin>>a>>b>>c; v[a].push_back(edge(b,c)); v[b].push_back(edge(a,c)); } memset(vis,0,sizeof(vis)); memset(dis,-1,sizeof(dis)); cin>>start>>_end>>NumPeople; dis[start] = 0; vis[start] = 1; int ans = f() - 1; if(NumPeople%ans==0) cout<<NumPeople/ans<<endl; else cout<<NumPeople/ans+1<<endl; }}
邻接矩阵来解答
#include <iostream>#include <vector>#include <cstring>using namespace std;const int maxn = 200;const int INF = 0x3f3f3f3f;int map[maxn][maxn];int vis[maxn],dis[maxn];int nv,ne;struct edge{ int AdjV; int distance;};int f(int st,int ed) { for (int i=1;i<=nv;i++) { vis[i]=0; dis[i]=-1; } vis[st] = 1; dis[st]=0; for(int i=1;i<=nv;i++) { if(map[st][i]!=0) { dis[i] = map[st][i]; } } for(int i=0;i<nv-1;i++) { int tmp=-1,k=st; for (int j=1;j<=nv;j++) { if(!vis[j]&&tmp<dis[j]) { tmp = dis[j]; k = j; } } //if (tmp==-1) return dis[ed]; vis[k] = 1; for (int j=1;j<=nv&&k!=st;j++) { if(!vis[j]&&dis[j]<min(map[k][j],dis[k])) { dis[j] = min(map[k][j],dis[k]); } } } return dis[ed]; //else return -1; }int main() { int t; cin>>t; while(t--) { cin>>nv>>ne; for (int i=1;i<=nv;i++) for (int j=1;j<=nv;j++) map[i][j]=0; //这里也也很重要! for (int i=0;i<ne;i++) { int a1,a2,a3; cin>>a1>>a2>>a3; map[a1][a2] = a3; map[a2][a1] = a3; } int st,ed,N; cin>>st>>ed>>N; int ans = f(st,ed); int tmp = N/(ans-1); if(tmp*(ans-1)==N) cout<<tmp<<endl; else cout<<tmp+1<<endl; // cout<<ans<<endl; }}
0 0
- 1937. 导游
- Sicily 1937. 导游
- 导游
- 导游
- 导游语录
- 校园导游
- 植物园的"黑导游"
- 《导游基础知识》试题库(一)
- 校园导游咨询
- 校园导游程序
- 导游还是跑游
- 校园导游咨询
- 校园导游咨询系统
- 机器人导游互联网
- 校园导游咨询
- 校园导游系统
- POCO C++库导游
- 小型校园导游系统
- Python实现简单网络爬虫功能
- Mybatis-SqlMapConfig.xml配置
- HIVE与mysql的关系 hive常用命令整理 hive与hdfs整合过程
- Spring框架--IOC
- 动画黄金搭档:CADisplayLink & CAShapeLayer
- 1937. 导游
- SplayTree伸展树的实现
- 关于数据库Varchar字段类型长度设计问题
- 2016 12.1 ~ 12.4 一周工作小结
- Zookeeper——3、使用zkClient操作zookeeper
- Kth Smallest Element in a BST
- 预处理标识符:__FILE__ __TIME__ __DATE__ __LINE__ ;#以及##的区别
- OKVIS IMU 误差公式版本
- java-20161203基础总结