九度 1100 最短路径
来源:互联网 发布:手机json格式转换工具 编辑:程序博客网 时间:2024/06/07 10:24
题目描述: N个城市,标号从0到N-1,M条道路,第K条道路(K从0开始)的长度为2^K,求编号为0的城市到其他城市的最短距离输入: 第一行两个正整数N(2<=N<=100)M(M<=500),表示有N个城市,M条道路接下来M行两个整数,表示相连的两个城市的编号输出: N-1行,表示0号城市到其他城市的最短路,如果无法到达,输出-1,数值太大的以MOD 100000 的结果输出。样例输入:4 41 22 31 30 1样例输出:8911
(大数mod处理)本题路径值为2^k (k最多500),结果取膜100000
由 (a+b)%m = (a%m +b%m)%m
得(2^a+2^b+·····2^k)%100000=(2^a%100000+2^b%100000 +·····2^k%100000)%100000所以得到每条路径%100000的值就行,最后相加再取膜100000就行
由a * b % m = (a % m * b % m)%m
2^( k+1)%100000=(2^k %100000 * 2%100000 )%100000 =2^k %100000*2%100000
所以要得到当前路径%100000,取上一条路径%100000的值乘2再取膜100000
但是因为保存的是取过膜的数没办法比较大小,仔细分析后发现2^k永远大于1+2^1+······+2^(k-1),后一条路会比前面所有路径的总值还大,所以直接保存这是第几条路径作为路径标号,比较时等式两边的集合中的最大路径标号所在方即为较大方,若相等比较次大的,这里可以考虑用set保存一下具体路径。
(…)原本以为求最短路径就是用Dijskstra,可是写到Dijskstra的松弛操作发现居然是一个最小生成树的题。原因就是2^k永远大于1+2^1+······+2^(k-1),那松弛的时候永远选的是标号最小的那条,那直接从最小边开始松弛,可以省去Dijskstra的 d[y]与d[x]+w[x][y]路径的大小判断。于是在生产最小生成树时,只要需要在合并根节点的时候就直接将整个图更新一下就保存了两点间的最短路径。
#include <iostream>#include <stdio.h>using namespace std;#define MAXN 101#define MAXM 501#define MAXW 100001int edge[MAXN][MAXN];int n,m;int f[MAXN];int findF (int t){ return f[t] == t ? t : f[t] = findF(f[t]);}void Union(int x, int y){ int xParent = findF(x); int yParent = findF(y); xParent > yParent ? f[xParent] = yParent : f[yParent] = xParent;}int main(){ while(cin >> n >> m){ int x,y, dis; for(int i = 0;i < n; i ++){ f[i] = i; edge[i][i] = 0; } for(int i = 0,dis = 1;i < m; i ++ ){ cin >> x >> y; int fx = findF(x) , fy = findF(y); if(fx != fy){ for(int j = 0; j < n; j ++){ if(fx == findF(j)) for(int k = 0; k < n; k ++){ if(fy == findF(k)) edge[j][k] = edge[k][j] = (edge[j][x] + dis + edge[y][k]) % 100000; } } } Union(x,y); dis = dis * 2 % 100000 ; } for(int i=1,root = findF(0); i<n; i++) findF(i) != root ? cout <<"-1" <<endl:cout <<edge[0][i]<<endl; }}
0 0
- 九度 1100 最短路径
- 九度OJ-1100:最短路径
- 九度 1100 最短路径
- 九度OJ 1100:最短路径 (最短路径)
- 九度OJ 1100 最短路径(大数)
- 九度 oj 题目1100:最短路径
- 九度-1008 最短路径
- 九度:1008<最短路径>
- 九度1008,最短路径问题
- [九度OJ]最短路径
- 九度oj 1008 最短路径
- 最短路径--九度1008.[Dijkstra]
- 九度[1008]-最短路径问题
- 九度OJ108 HDOJ3790:最短路径问题 迪杰斯特拉算法
- 九度OJ 1008最短路径问题
- 九度OnlineJudge之最短路径问题
- 九度oj 题目1008:最短路径问题
- 九度:题目1008:最短路径问题
- 蒟蒻养成记——幼儿园数论(1)
- 深度学习资料资源
- 图像特征提取三大法宝:HOG特征,LBP特征,Haar特征
- Chain of Responsibility模式
- 第三方app内置到system/priv-app或者system/app中无法正常运行的问题。
- 九度 1100 最短路径
- java知识点整理
- MessageFormat.format使用示例
- 根据屏幕大小显示不同的字
- 150.自定义侧面滑动菜单
- flex布局
- 1070. 结绳
- linux下的简单的stat函数的使用
- 记录学习《0Day安全》路上遇到的问题解决方案: 阶段性总结-重重保护下的堆!