题目描述:

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:最短路径的更多相关文章

  1. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  2. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  4. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  5. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  6. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  7. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  8. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

  9. 九度OJ题目1003:A+B

    while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...

随机推荐

  1. 8、二进制中1的个数------------>剑指offer系列

    题目 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 法一:分析 这是一道考察二进制的题目 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1. 二进制 ...

  2. Vuex.js状态管理共享数据 - day8

    VScode文件目录: amount.vue代码如下: <template> <div> <!-- <h3>{{ $store.state.count }}& ...

  3. CSS 中,用 float 和 position 的区别是什么?

    CSS 中,用 float 和 position 的区别是什么? 呃,其实这个命题有误,只有position才是定位,float不能说是定位,不过你可以说这两种布局方式有什么不同.float和posi ...

  4. 洛谷 P1276 校门外的树(增强版)

    题目描述 校门外马路上本来从编号0到L,每一编号的位置都有1棵树.有砍树者每次从编号A到B处连续砍掉每1棵树,就连树苗也不放过(记 0 A B ,含A和B):幸运的是还有植树者每次从编号C到D 中凡是 ...

  5. (十四)maven之启动tomcat

    前言:在网上找了好几种方法启动web项目.比较好用的是:①在Project Facets勾上Dynamic....,但是这个方法会改变项目结构(把WebContent的东西都弄出来了):②使用jett ...

  6. SublimeREPL配置Python3开发

    首先什么是REPL? A Read-Eval-Print-Loop (REPL) is available both as a standalone program and easily includ ...

  7. HDU 6069 Counting Divisors(区间素数筛法)

    题意:...就题面一句话 思路:比赛一看公式,就想到要用到约数个数定理 约数个数定理就是: 对于一个大于1正整数n可以分解质因数: 则n的正约数的个数就是 对于n^k其实就是每个因子的个数乘了一个K ...

  8. glob - 形成路径名称

    描述 (DESCRIPTION) 很久以前 在 UNIX V6 版 中 有一个 程序 /etc/glob 用来 展开 通配符模板. 不久以后 它 成为 shell 内建功能. 现在 人们 开发了 类似 ...

  9. winhex 中磁盘大小与偏移

    下图为c盘(活动分区).上方base offset为相对于整个硬盘的字节偏移量.partition 1中信息包括c盘开始扇区,总扇区数.partition 2 信息为扩展分区开始扇区和扇区数.由 P1 ...

  10. NoSuchBeanDefinitionException: No qualifying bean of type 'com.bj186.ssm.mapper.EmployeeMapper' available: expected at least 1 bean which qualifies as autowire candidate

    在搭建SSM spring springmvc  mybatis整合的时候, 遇到了这个问题 说说我的问题吧!我在进行单元测试的时候,出现了这个错误,网上一查才知道是,配置文件中没有写扫描包信息.一看 ...