九度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,其表示形式是:从个位开始,每三位数用逗号", ...
随机推荐
- 1102 采药 2005年NOIP全国联赛普及组
1102 采药 2005年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 辰辰是个天资聪颖的孩子 ...
- Sublime的用法
一.首先安装插件 1.安装Package Control,这是为了安装其他插件做基础,它可以方便我们下载其他插件 (1).按Ctrl+`调出console(注:避免热键冲突) (2).粘贴以下代码到命 ...
- 前端上传插件Plupload的实际使用(个人实操)
一个主要的页面,其中包裹了一个iframe页面,在项目中,这个iframe页面包裹在主页面的div标签中,主要用于上传文件附件. 用的是plupload.full插件,主要引入以下几个js: jque ...
- 51nod 1174 区间中最大的数(送盾题)
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. ...
- GNU make(2)
GNU make(2) 参考: GNU Make学习总结(二) 变量 变量由一个前导符号$加上字符或者是括号字符组成, 名称区分大小写. 命名: 习惯上用全部大写字符表示常量, 小写字符表示变量, 单 ...
- 转载:收费版APP三年总结(个人经验+数据图分享)
各位朋友好,apop感觉这里的朋友有许多是以广告收入为主,所以apop来分享另外一块(收费版APP)的个人三年来的总结分享,希望对各位有帮助.首 先,其实在AppStore(或GooglePlay)上 ...
- 五、Pandas玩转数据
Series的简单运算 import numpy as np import pandas as pd s1=pd.Series([1,2,3],index=['A','B','C']) print(s ...
- Linux命令基础操作--vim 归档 压缩 分区 格式化 挂载 Innode
1 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) 使用 cat命令将查看的文件合并输出到/1.txt 这里的关键:定位到文件,如果后面加上/后被认为是目录 分为两步,先 ...
- 使用gcc -g编译,gdb调试时仍然存在“no debug symbols found”的错误
今天为调试一段代码,使用gcc将程序用-g选项重新编译.但是使用gdb进行debug时,仍然出现“no debug symbols found”的错误.仔细检查了一下Makefile,原来后面定义的连 ...
- C++ lvalue,prvalue,xvalue,glvalue和rvalue详解(from cppreference)
General 每一个C++表达式(一个操作符和它的操作数,一个字面值,一个变量名等等)都代表着两个独立属性:类型+属性分类.在现代C++中 glvalue(泛左值) = lvalue (传统意义上的 ...