时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:4185

解决:619

题目描述:

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
来源:
2010年上海交通大学计算机研究生机试真题

思路:

此题的路径长度很特殊,不能用普通的数值来表示。可以用数组或字符串的方式来表示路径长度,同时定义相应的大整数运算。

但由于路径长度的特殊性,更简单的办法是求最小生成树,求的过程中顺便求得最短路径。

我开始用的第一种方法,需要考虑的细节较多,出错了几次,后来用第二种方法AC的。

代码:

#include <stdio.h>
#include <stdlib.h> int rank[100] ;//记录每个树的深度
int pre[100];//记录每个点的父节点
int d[100][100];//记录各对间的距离 void initSet(int n)//初始化,将每个点的父节点设为自己,深度为1
{
int i;
for(i=0; i<n; i++)
{
rank[i] = 1;
pre[i] = i;
d[i][i] = 0;
}
} int findSet(int x)//找到每个点的父节点,并将这个点的父节点设置为数的根节点
{
if(x != pre[x])
pre[x] = findSet(pre[x]);
return pre[x];
} void unionSet(int a, int b)//合并树,
{
int x = findSet(a);
int y = findSet(b);
if(x == y)//如果两个节点的父节点(树的根节点)是同一个,无需合并,直接跳过
return;
if(rank[x] >= rank[y])
{
rank[x] += rank[y];
pre[y] = x;
}
else
{
rank[y] += rank[y];
pre[x] = y;
}//不是同一个树的的节点,小树合并到大树
} int mod(int a, int b)//取模
{
int ret = 1;
while(b--)
ret = (ret*a)%100000;
return ret;
} int main()
{
int n, m, dist;
int x, y, a, b;
int i, j, k;
while(scanf("%d%d", &n, &m)!=EOF)
{
initSet(n);
for(i=0; i<m; i++)
{
scanf("%d%d", &x, &y);
a = findSet(x);
b = findSet(y);
if(a == b)//二者已在同一个连通分量,距离定是最小了
continue;
dist = mod(2, i);//取模
for(j=0; j<n; j++)//更新两个连通分量的各对经过中间对的距离
{
if(a != findSet(j))
continue;
for(k=0; k<n; k++)
{
if(b != findSet(k))
continue;
d[j][k] = d[k][j] = (d[j][x]+dist+d[y][k])%100000;
}
}
unionSet(x, y);
}
x = findSet(0);
for(i=1; i<n; i++)
if(findSet(i) != x)
printf("-1\n");
else
printf("%d\n", d[0][i]);
}
}
/**************************************************************
Problem: 1100
User: liangrx06
Language: C
Result: Accepted
Time:10 ms
Memory:952 kb
****************************************************************/

九度OJ 1100:最短路径 (最短路径)的更多相关文章

  1. 九度OJ 1008:最短路径问题 (最短路)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8064 解决:2685 题目描述: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费 ...

  2. 【九度OJ】题目1192:回文字符串 解题报告

    [九度OJ]题目1192:回文字符串 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1192 题目描述: 给出一个长度不超过1000的 ...

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

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

  4. 九度OJ 1502 最大值最小化(JAVA)

    题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...

  5. 九度OJ,题目1089:数字反转

    题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...

  6. 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)

    题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...

  7. 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...

  8. 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)

    题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述:     省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...

  9. 九度OJ 1371 最小的K个数 -- 堆排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...

随机推荐

  1. Linux 之 文件压缩解压

    文件压缩解压 参考教程:[千峰教育] 命令: gzip: 作用:压缩文件,只能是单个文件,不能是多个,也不能是目录. 格式:gzip file 说明:执行命令会生成file.gz,删除原来的file ...

  2. html css的简单学习(二)

    html css的简单学习(二) <!Doctype html>告诉浏览器,这是一个html文档.lang="en" 默认是en,表示英语:zh-Hans 中文简体:z ...

  3. Python Challenge 第一关

    偶然在网上看到这个,PYTHON CHALLENGE,利用Python语言闯关,觉得挺有意思,就记录一下. 第0关应该算个入口吧,试了好几次才试出来,没什么代码就不写了.计算一个结果出来就行. 第一关 ...

  4. IP分段小记

    192.168.0.1 个人电脑:0.2-0.50 硬件开发板:0.51-0.100 机器人工控机:0.101-0.200 激光雷达:192.168.254.51~100 编码器板子:192.168. ...

  5. django删除表重建&修改用户密码&base64加密解密字符串&ps aux参数说明&各种Error例子

    1.django的queryset不支持负索引 AssertionError: Negative indexing is not supported. 2.django向前端JavaScript传递列 ...

  6. Maven插件maven-antrun-plugin的使用

    以下引用官方的介绍http://maven.apache.org/plugins/maven-antrun-plugin/: 一.什么是maven-antrun-plugin? 该插件提供从Maven ...

  7. oceanbase 分布式数据库

    http://blog.csdn.net/maray/article/details/7230881 http://weibo.com/raywill2

  8. 【linux】CentOS编译程序报错 修复 ./Modules/_ssl.c:64:25: 致命错误:openssl/rsa.h:没有那个文件或目录

    如果你在编译时遇到这个错误,这可能是下面的原因:你尝试编译的程序使用OpenSSL,但是需要和OpenSSL链接的文件(库和头文件)在你Linux平台上缺少. 所以在CentOS下, 退到根路径,[需 ...

  9. Unity -- 入门教程二

    为了接下来要做的小游戏,在这里我要小小的修改一下移动的代码. public class PlayerMove : MonoBehaviour { //定义移动的速度 public float Move ...

  10. 调用tensorflow中的concat方法时Expected int32, got list containing Tensors of type '_Message' instead.

    grid = tf.concat(0, [x_t_flat, y_t_flat, ones])#报错语句 grid = tf.concat( [x_t_flat, y_t_flat, ones],0) ...