ACM训练-floyd算法

问题描述:多源点问题和负权值图的最短路径

算法描述:Floyd算法是一个经典的动态规划算法。从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。

源代码:

 1 #include<stdio.h>
 2 #define MAX 100000
 3 int main()
 4 {
 5     int n;
 6     int arcs[10][10],path[10][10];//pat[i][j]=k 表示从i到j会经过k
 7     FILE *fp=fopen("floyd_data.txt","r");
 8     if(fp==NULL)
 9     {
10         printf("open file error\n");
11         return 0;
12     }
13     scanf("%d",&n);
14     for(int i=0;i<n;i++)
15     {
16         for(int j=0;j<n;j++)
17         {
18             fscanf(fp,"%d",&arcs[i][j]);
19             path[i][j]=j; //初始化
20         }
21     }
22     for(int k=0;k<n;k++)
23     for(int i=0;i<n;i++)
24     for(int j=0;j<n;j++)
25     if(arcs[i][k]+arcs[k][j]<arcs[i][j])
26     {
27         arcs[i][j]=arcs[i][k]+arcs[k][j];
28         path[i][j]=k;
29     }
30     for(int i=0;i<n;i++)
31     {
32         for(int j=0;j<n;j++)
33         {
34             printf("%d->%d:%d    ",i,j,arcs[i][j]);
35             int t=i;
36             while(t!=j)
37             {
38                 printf("%d--",t);
39                 t=path[t][j];
40             }
41             printf("%d",t);
42             printf("\n");
43         }
44
45     }
46     if(fclose(fp)!=0) printf(" close file error\n");
47 }

时间复杂度:O(n3)

时间: 2024-08-04 13:44:29

ACM训练-floyd算法的相关文章

ACM: POJ 3660 Cow Contest - Floyd算法

链接 Cow Contest Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we all know, some cows code better than others. Eac

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京

2014暑假ACM训练总结

2014暑假ACM训练总结报告 匆匆之中,一个暑假又过去了,在学校训练的这段日子真的是感觉日子过得好快啊! 时光如箭,日月如梭! 匆忙的学习之中一个暑假就这样结束了,现在就来写一些总结吧,供自己以后阅读和回忆吧! 2014年7月14我们即可1303考完了最后一科模拟电路,也宣告了暑假的到来!本来有刚好两 星期的时间可以回家或是去做其他的事,然后我在学校呆了几天,无聊之余便回家了.在家呆了大概 7天,便正式回校了,准备学校的ACM的训练去了. 先亮一下暑假的训练计划吧! 集训详情: 第一周回顾知识

POJ 3615 Cow Hurdles (Floyd算法)

Cow Hurdles Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6142   Accepted: 2752 Description Farmer John wants the cows to prepare for the county jumping competition, so Bessie and the gang are practicing jumping over hurdles. They are

hdu 1874 畅通工程续(Floyd算法)

题目来源:[hdu1874](http://acm.hdu.edu.cn/showproblem.php?pid=1874) 题目大意: 输入一个n,m,表示有n个城市,编号从1到n,有m条路,每条路输入连接的两个城市编号A,B,及路的长度X,题目说X表示从A到B的双向长度,故应建无向图.然后输入起点S与终点T,求从S到T得最短路径,若不存在,就输出-1. 题目分析: 基础的求最短路径题,使用Floyd算法可求出任意两个顶点间的最短距离,给出起点与终点,将map[S][T]进行输出即可,判断是否

hdu 1599 find the mincost route (最小环与floyd算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1599 find the mincost route Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2530    Accepted Submission(s): 1006 Problem Description 杭州有N个景区,景区之间有一

ACM训练二C题

kmp对我真无奈,我对kmp真苦恼.就是个算法嘛,我以为凭我脖子上的东西可以搞定,现在好了--搞得我头都大了.要我写个啥next的值,五个字:那都不是事.一到啥实际应用吧,我意识不行了,搞不清next到底有什么作用,能干什么.就好比见到了二分啊-- 此题的意思呢,我弄了很久,其实是找相同串,比如ACMACMACMACMACMA,从后往前看next就行了,比如最后一个next[15] = 13,代表前13个字符串和后13位相同,直接用总长16 - 13 = 3,为一个解,接下来看next[13]了

[Swust OJ 412]--医院设置(floyd算法)

题目链接:http://acm.swust.edu.cn/problem/412/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 设有一棵二叉树,如图:  其中,圈中的数字表示结点中居民的人口.圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相信接点之间的距离为1.如上图中,若医院建在: 1处,则距离和=4+12+2*20+2*40=136 3处,则距离和=4*2+13+20+

HDU 2066 最短路floyd算法+优化

http://acm.hdu.edu.cn/showproblem.php?pid=206 题意 从任意一个邻居家出发 到达任意一个终点的 最小距离 解析 求多源最短路 我想到的是Floyd算法 但是题目给出的n的大小不确定 所以图很稀疏 会有很多孤立点 会多跑很多没用的路径 需要优化一下 不然会超时 我看其他人很多都是用迪杰斯特拉写的,可以试试 AC代码 1 #include <stdio.h> 2 #include <math.h> 3 #include <string.