题目描述:

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. 1102 采药 2005年NOIP全国联赛普及组

    1102 采药 2005年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold       题目描述 Description 辰辰是个天资聪颖的孩子 ...

  2. 怎样将python的文件转化为windows的可执行程序

    最近我在刚入手python,其中就学到了怎样将python的py格式文件转化为windows的exe执行程序, 是这样的,首先要创建一个py文件,这里给截图吧 接下来就以这个python文件为例创建一 ...

  3. linux各文件夹的作用(转)

    转自:http://www.cnblogs.com/amboyna/archive/2008/02/16/1070474.html linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可 ...

  4. Linux中grep、sed、awk使用介绍

    linux文件操作命令介绍1)grepgrep 用于在文件中查找符合条件的记录grep 参数 过滤条件 文件过滤的条件中可使用正则表达式-c 显示符合的行数-i 忽略大小写-n 显示符合要求的记录,包 ...

  5. JBOSS连接池默认连接数是多少?在哪个配置文件有这个默认的连接数?

    如果你用的是是4.x的Jboss的话,请参考:docs/dtd/jboss-ds_1_0.dtd,相信你很容易就能找到控制最大/最小连接数的选项,应该是诸如:max-pool-size/min-poo ...

  6. LINUX提高openfire并发数(网上收集)

    谷歌博客地址:http://tsaiquinn.blogspot.com/2014/10/linuxopenfire.html 影响连接数的元素包含三种:1)Linux的系统参数2)进程自身可以创建的 ...

  7. Netbeans使用笔记

    Netbeans 新建项目 A brand new project 选择"文件">"新建项目"以打开新建项目向导. 在向导中,选择 "C/C++ ...

  8. Could not load OpenSSL解决

    问题 Could not load OpenSSL. You must recompile Ruby with OpenSSL support or change the sources in you ...

  9. 简单明了理解Java移位运算符

    无须多言: @Test public void intro() { assertThat("应该相等", -1 >> 1, equalTo(-1)); assertTh ...

  10. Codeforces Round #318 (Div. 2) A Bear and Elections (优先队列模拟,水题)

    优先队列模拟一下就好. #include<bits/stdc++.h> using namespace std; priority_queue<int>q; int main( ...