九度oj 题目1100:最短路径
- 题目描述:
-
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 4
1 2
2 3
1 3
0 1
- 样例输出:
-
8
9
11
这道题考了最短路径算法和大数运算,好歹做出来了#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm> #define MAX 102
#define TENLEN 200
#define modN 100000
using namespace std; int flag[MAX];
int k2[TENLEN];
int minDis[TENLEN];
int dis[TENLEN]; struct Node
{
int dis[TENLEN];
int zhi;
}; int graph[MAX][MAX];
Node map[MAX][MAX];
Node lowCost[MAX]; void calSum(int sum[], int a[], int b[]) {
int ci = ;
for(int i = ; i < TENLEN;i++) {
int ben = (a[i] + b[i] + ci) % ;
ci = (a[i] + b[i] + ci)/;
sum[i] = ben;
}
} int cmp(int a[], int b[]) {
for(int i = TENLEN-; i >= ; i--) {
if(b[i] > a[i]) {
return -;
}
else if(a[i] > b[i]) {
return ;
}
}
return ;
} int copy(int a[], int b[]) {
for(int i = ; i < TENLEN; i++) {
b[i] = a[i];
}
} void modNprint(int a[]) {
bool isBegin = false;
for(int i = ; i >= ; i--) {
if(!isBegin && a[i] != ) {
isBegin = true;
printf("%d", a[i]);
}
else if(isBegin){
printf("%d", a[i]);
}
}
if(!isBegin) {
printf("");
}
printf("\n");
} void print(int a[]) {
bool isBegin = false;
for(int i = TENLEN - ; i >= ; i--) {
if(!isBegin && a[i] != ) {
isBegin = true;
printf("%d", a[i]);
}
else if(isBegin){
printf("%d", a[i]);
}
}
if(!isBegin) {
printf("");
}
printf("\n");
}
int main(int argc, char const *argv[])
{
int n, m;
//freopen("input.txt","r",stdin);
while(scanf("%d %d",&n,&m) != EOF) {
memset(k2, , sizeof(k2));
k2[] = ;
for(int i = ; i < n; i++) {
for(int j = ; j < n; j++) {
graph[i][j] = ;
}
}
for(int i = ; i < m; i++) {
int atemp, btemp;
scanf("%d %d",&atemp,&btemp);
copy(k2, map[atemp][btemp].dis);
copy(k2, map[btemp][atemp].dis);
graph[atemp][btemp] = ;
graph[btemp][atemp] = ;
calSum(k2, k2, k2);
//print(k2);
} memset(flag, , sizeof(flag));
flag[] = ;
for(int i = ; i < n; i++) {
if(graph[][i] == ) {
copy(map[][i].dis,lowCost[i].dis);
}
} for(int i = ; i < n; i++) {
for(int j = ; j < TENLEN; j++) {
minDis[j] = ;
}
int min = -; for(int j = ; j < n; j++) {
if(flag[j] == && graph[][j] == ) { if(cmp(minDis, lowCost[j].dis) == ) {
copy(lowCost[j].dis,minDis);
//print(minDis);
//print(lowCost[j].dis);
min = j;
}
}
}
//printf("min is %d\n",min);
if(min != -) {
flag[min] = ;
for(int j = ; j < n; j++) {
if(flag[j] == && graph[min][j] == ) {
calSum(dis, lowCost[min].dis, map[min][j].dis);
if(graph[][j] == || cmp(dis,lowCost[j].dis) == -) {
graph[][j] = ;
copy(dis,lowCost[j].dis);
}
} }
}
}
for(int i = ; i < n; i++) {
if(graph[][i] == ) {
modNprint(lowCost[i].dis);
}
else {
puts("-1");
} }
}
return ;
}占用的内存略大,还需要再精简
九度oj 题目1100:最短路径的更多相关文章
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 九度oj 题目1007:奥运排序问题
九度oj 题目1007:奥运排序问题 恢复 题目描述: 按要求,给国家进行排名. 输入: 有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ题目1105:字符串的反码
tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...
- 九度oj题目1009:二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...
- 九度oj题目1002:Grading
//不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...
- 九度OJ题目1003:A+B
while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...
随机推荐
- let和const注意点
let 一.块级作用域 下面的代码如果使用var,最后输出的是10. var a = []; for (var i = 0; i < 10; i++) { a[i] = function () ...
- Linux下环境搭建(二)——jenkins+gitlab配置
配置jenkins+gitlab环境,需要依托java环境,在之前的博文中,已配置好java环境,所以可以直接搭建这两个工具的环境即可. jenkins配置 jenkins的配置方法,在之前windo ...
- DRP项目
DRP(distribution resource planning)分销资源计划是管理企业的分销网络的系统,目的是使企业具有对订单和供货具有快速反应和持续补充库存的能力.解决了随着企业销售规模的逐渐 ...
- static心得
TextClass text; 吉晨 static注意 只要显式调用一个类的某一个static变量,那么就会连带static块,所有static变量一起调用,哪怕不去new一个对象,这时候已经对这 ...
- 如何在腾讯云上安装Cloud Foundry
Cloud Foundry是VMware推出的业界第一个开源PaaS云平台,它支持多种框架.语言.运行时环境.云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的 ...
- O2O的十八个细分市场,运营模式如何?
社区O2O,这个行业也被媒体热炒有三年多时间了,有没有做的还算不错的案例呢?万科.龙湖.恒大.保利.易居中国.彩生活.拉卡拉.顺丰?哪个可以称得上是成功案例?战略变来变去,方向换来换去,基本上都是雷声 ...
- 关于HTML5中Video标签无法播放mp4的解决办法
1.首先先排除掉代码问题.路径问题.浏览器不支持问题等常规问题,这些问题另行百度. <video width="500px" height="300px" ...
- UVA - 11082 Matrix Decompressing (最大流,技巧)
很经典的网络流模型,行编号和列编号分别看成一个点,行和列和分别看出容量,一个点(x,y)看出是一条边,边的容量下界是1,所以先减去1,之后在加上就好了. 建图的时候注意分配好编号,解从残留网络中的边找 ...
- UVA 1151 Buy or Build (最小生成树)
先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为0,直接用并查集缩点.正确性是基于一个贪心, 在做Kruskal算法是,对于没有进入最小生成树的边,排序在它前面的边不会减少. ...
- jni 开发
创建android工程 -> 添加native 函数 添加库之后: 1. 用javah 生成c语言.h头文件时, 在cmd 窗口中cd 到bin/classes 目录下执行下代码无效: java ...