当前位置: 首页 > wzjs >正文

网站建设要做哪些前期准备工作海南网络广播电视台地震避险常识

网站建设要做哪些前期准备工作,海南网络广播电视台地震避险常识,无锡工程建设监察支队网站,百度搜索风云榜题目大意 给出 n n n 个顶点 m m m 条长度在 1 1 1 ~ 5000 5000 5000 的边的图,求图中从 1 到 n n n 与最短路的路径可重复的严格次短路。(严格的含义是,一定比最短路要长,不能相等) 分析 我们先将问题简单化&…

题目大意

给出 n n n 个顶点 m m m 条长度在 1 1 1 ~ 5000 5000 5000 的边的图,求图中从 1 到 n n n 与最短路的路径可重复的严格次短路。(严格的含义是,一定比最短路要长,不能相等)

分析

我们先将问题简单化,如何去求一个非严格的次短路呢?设次短路径为 { 1 , a 1 , a 2 , . . . , a k , n } \{1,a_1,a_2,...,a_k,n\} {1,a1,a2,...,ak,n}
a k = i a_k=i ak=i 时,方案变为 { 1 , a 1 , a 2 , . . . , a k − 1 , i , n } \{1,a_1,a_2,...,a_{k-1},i,n\} {1,a1,a2,...,ak1,i,n}
方案的属性:

  1. 路径长度 = 子方案路径长度 + w ( i , n ) w(i,n) w(i,n)
  2. 路径的目的地。

由于,原方案求解的是次短路径长度。那么子方案路径长度有可能是最短路径或次短路径。得到松弛递推式
d i s t 2 [ n ] = min ⁡ ( d i s t 2 [ n ] , d i s t [ i ] + w ( i , n ) , d i s t 2 [ i ] + w ( i , n ) ) ,同时保证不与最短路同等路径 dist2[n]=\min(dist2[n],dist[i]+w(i,n),dist2[i]+w(i,n)),同时保证不与最短路同等路径 dist2[n]=min(dist2[n],dist[i]+w(i,n),dist2[i]+w(i,n)),同时保证不与最短路同等路径
因此,在求解次短路之前,要先求解最短路径。或者在求解次短路的过程中,一边求最短路径。

根据,正权边的限制可知,次短路径长度长的问题都是由次短路径长度短的问题递推而来。因此,也可以使用 dijkstra 的递推贡献式求解方法。

非严格次短路 写法 1:

#include<bits/stdc++.h>
#define int long longusing namespace std;const int N = 1e5 + 10;struct node{int to,val;bool operator <(const node &p)const{return val > p.val;}
};struct edge{int to,val,id;
};
vector<edge> v[N];int n,m,id;
int dist[N],flag[N],pre[N]; //pre 数组用于记录最短路是用哪条边松弛的
void dij(){priority_queue<node>q;for(int i = 1; i <= n; i++) flag[i] = 0,dist[i] = 1e9;q.push({1,0});dist[1] = 0;while(q.size()){node p = q.top();q.pop();if(flag[p.to]) continue;flag[p.to] = 1;for(int i = 0; i < v[p.to].size(); i++){edge j = v[p.to][i];if(dist[j.to] > p.val + j.val){dist[j.to] = p.val + j.val;pre[j.to] = j.id;q.push({j.to,dist[j.to]});}}	}	
}int dist2[N];
void dij2(){priority_queue<node>q;for(int i = 1; i <= n; i++) flag[i] = 0,dist2[i] = 1e9;for(int i = 1; i <= n; i++)q.push({i,0}); //由于并不知道哪个次短路最短,所以将所有的顶点加入到图中,先都求解一遍相应的次短路while(q.size()){node p = q.top();q.pop();if(flag[p.to] == 2) continue;// 第二次开始跑次短路flag[p.to]++;for(int i = 0; i < v[p.to].size(); i++){edge j = v[p.to][i];if(dist2[j.to] > dist[p.to] + j.val && j.id != pre[j.to]){ // 判断不是最短路 dist2[j.to] = dist[p.to] + j.val;q.push({j.to,dist2[j.to]});}if(dist2[j.to] > dist2[p.to] + j.val){dist2[j.to] = dist2[p.to] + j.val;q.push({j.to,dist2[j.to]});}}	}	
}
signed main(){ cin >> n >> m;for(int i = 1; i <= m; i++){int x,y,w;cin >> x >> y >> w;v[x].push_back({y,w,++id}); // id 给边一个编号v[y].push_back({x,w,++id});}dij();dij2();cout << dist2[n] << endl;return 0;
}

非严格次短路 写法 2

#include<bits/stdc++.h>
#define int long longusing namespace std;const int N = 1e5 + 10;struct node{int to,val,now; //now 1/2 代表当前是最短路还是次短路 bool operator <(const node &p)const{return val > p.val;}
};struct edge{int to,val;
};
vector<edge> v[N];int n,m,id;
int dist[N][4],flag[N][4];
void dij(){priority_queue<node>q;for(int i = 1; i <= n; i++) flag[i][1] = flag[i][2] = 0,dist[i][1] = dist[i][2] = 1e9;q.push({1,0,1});  dist[1][1] = 0;while(q.size()){node p = q.top();q.pop();if(flag[p.to][p.now]) continue;//	cout << p.to << " " << p.now << " " << p.val << "GGGG"<< endl;flag[p.to][p.now] = 1;for(int i = 0; i < v[p.to].size(); i++){edge j = v[p.to][i];if(dist[j.to][1] >= p.val + j.val){dist[j.to][2] = dist[j.to][1];dist[j.to][1] = p.val + j.val;q.push({j.to,dist[j.to][1],1});q.push({j.to,dist[j.to][2],2}); // 不要忘记加入到有优先队列,因为其他次短路可能由该次短路更新}else if(dist[j.to][2] > p.val + j.val){dist[j.to][2] = p.val + j.val;q.push({j.to,dist[j.to][2],2});}}	}	
}signed main(){ cin >> n >> m;for(int i = 1; i <= m; i++){int x,y,w;cin >> x >> y >> w;v[x].push_back({y,w});v[y].push_back({x,w});}dij();cout << dist[n][2] << endl;return 0;
}

严格次短路

而如何去求解非严格最短路呢?只需要将松弛式修改为
d i s t 3 [ n ] = min ⁡ ( d i s t 3 [ n ] , d i s t [ i ] + w ( i , n ) , d i s t 2 [ i ] + w ( i , n ) ) ,同时保证不与最短路长度相同即可 dist3[n]=\min(dist3[n],dist[i]+w(i,n),dist2[i]+w(i,n)),同时保证不与最短路长度相同即可 dist3[n]=min(dist3[n],dist[i]+w(i,n),dist2[i]+w(i,n)),同时保证不与最短路长度相同即可

#include<bits/stdc++.h>
#define int long longusing namespace std;const int N = 1e5 + 10;struct node{int to,val;bool operator <(const node &p)const{return val > p.val;}
};struct edge{int to,val,id;
};
vector<edge> v[N];int n,m,id;
int dist[N],flag[N],pre[N];
void dij(){priority_queue<node>q;for(int i = 1; i <= n; i++) flag[i] = 0,dist[i] = 1e9;q.push({1,0});dist[1] = 0;while(q.size()){node p = q.top();q.pop();if(flag[p.to]) continue;flag[p.to] = 1;for(int i = 0; i < v[p.to].size(); i++){edge j = v[p.to][i];if(dist[j.to] > p.val + j.val){dist[j.to] = p.val + j.val;pre[j.to] = j.id;q.push({j.to,dist[j.to]});}}	}	
}int dist2[N];
void dij2(){priority_queue<node>q;for(int i = 1; i <= n; i++) flag[i] = 0,dist2[i] = 1e9;for(int i = 1; i <= n; i++)q.push({i,0});while(q.size()){node p = q.top();q.pop();if(flag[p.to] == 2) continue;flag[p.to]++;for(int i = 0; i < v[p.to].size(); i++){edge j = v[p.to][i];if(dist2[j.to] > dist[p.to] + j.val && j.id != pre[j.to]){ // 并且不是最短路 dist2[j.to] = dist[p.to] + j.val;q.push({j.to,dist2[j.to]});}if(dist2[j.to] > dist2[p.to] + j.val){dist2[j.to] = dist2[p.to] + j.val;q.push({j.to,dist2[j.to]});}}	}	
}int dist3[N];
void dij3(){for(int i = 1; i <= n; i++) flag[i] = 0,dist3[i] = 1e9;for(int i = 1; i <= n; i++){ //由于最短路、非严格次短路已经求解//直接枚举所有边进行松弛操作可求解严格次短路。for(int j = 0; j < v[i].size(); j++){edge k = v[i][j];int to = k.to,val = k.val;if(dist[to] != dist2[to]){dist3[to] = dist2[to];continue;}if(dist[to] != dist[i] + val){dist3[to] = min(dist3[to],dist[i] + val);}if(dist[to] != dist2[i] + val){dist3[to] = min(dist3[to],dist2[i] + val);}}}
}signed main(){ cin >> n >> m;for(int i = 1; i <= m; i++){int x,y,w;cin >> x >> y >> w;v[x].push_back({y,w,++id});v[y].push_back({x,w,++id});}dij();dij2();dij3();cout << dist3[n] << endl;return 0;
}

文章转载自:

http://PfWztEIG.smtrp.cn
http://p984cLSx.smtrp.cn
http://M8O3iE0X.smtrp.cn
http://GqnS1QrD.smtrp.cn
http://hRtsjCpk.smtrp.cn
http://edmOOhh5.smtrp.cn
http://EN9xWJ7D.smtrp.cn
http://1E2kx6A9.smtrp.cn
http://RZIfw47V.smtrp.cn
http://zRIlkstI.smtrp.cn
http://Hd94W0m6.smtrp.cn
http://MoiEhSFi.smtrp.cn
http://00E4Rra9.smtrp.cn
http://XkWE9nyy.smtrp.cn
http://5FY2sqLe.smtrp.cn
http://k1ZQCi8M.smtrp.cn
http://FxHjGfqr.smtrp.cn
http://hDwraypX.smtrp.cn
http://IkR95UEE.smtrp.cn
http://OKTZRtYQ.smtrp.cn
http://0pSnLBaN.smtrp.cn
http://NRN9Bm3Y.smtrp.cn
http://LzTCQVYN.smtrp.cn
http://E4rWAhBO.smtrp.cn
http://QkfGLmR2.smtrp.cn
http://qOF7dD5o.smtrp.cn
http://ulTmLNbb.smtrp.cn
http://s5d6JYWN.smtrp.cn
http://8tLlAjTd.smtrp.cn
http://Dyo8uGVV.smtrp.cn
http://www.dtcms.com/wzjs/665115.html

相关文章:

  • 免费开网站新浪博客怎么给自己网站做链接吗
  • 高校 网站建设实施方案网站建设方案和报价表
  • 成都网站建设 网络公司网站建设有哪些优质公众号
  • 从零开始做一个网站需要多少钱wordpress如何设置用户登录
  • 开公司做网站石油 技术支持 东莞网站建设
  • 太原住房与城乡建设厅网站厦门建网站费用一览表
  • 珠海网站建设公顺德网站开发招聘
  • 网站后台 网站页面没有显示微网站界面设计
  • 制作个网站需要多少钱如何备份wordpress网站
  • 建设一个大型网站需要多少钱上海的网站开发公司
  • 做一个网站需要多大的空间禾天姿网站建设
  • 山门做网站丹东市网站开发公司
  • 百度 网站质量静态网页设计制作实训报告摘要
  • 网站开发公司郑州深圳国际物流公司排名前十
  • 朔州网站建设费用wordpress胖子马
  • 做网站的计划2022最新热点时评十篇
  • 企业网站建设需要考虑内容金华网站建设方案报价
  • 广州网站建设策划免费源码交易网站源码
  • 银川网站建设实习生crm系统是什么意思啊
  • 网站建设工单系统凡科做的网站推效果
  • 浙江品牌网站建设深圳网站建设的价格
  • 建设银行建湖支行官方网站wordpress注册密码
  • 聊城做网站的公司平台如何制作公司网站和网页
  • 免费商城网站模板惠州做网站优化
  • 做英文网站要会什么购物网网站建设
  • 做网站有没有用有没有免费看的视频
  • 专业提供网站制作wordpress 自定义类型
  • 专业的制作网站开发公司商丘网上房地产查询系统
  • 天津市建设工程定额管理站网站用php写wordpress
  • 微信怎么开团购卖东西沈阳关键词seo