最短路Floyd(hdu1874),dijstra(poj2387)

Floyd算法,多源最短路,O(n^3)

所以时间很受限制……

主要注意细节,记住简单的三层for循环就好

1.初始化输入:

多样例,所以数组清空

注意重边情况,注意自己到自己是0

2.三层for

循环遍历每个点k, 循环计算map[i][j],看i->j最小还是i->k->j最小。

hdu1874

#include <cstdio>
#include <cstring>
#define MAX 202
#define min(x,y) x<y?x:y
#define inf 0x3f3f3f3f
using namespace std;
int map[MAX][MAX];

int main(){
int V,E,s,t;
	while(scanf("%d%d",&V,&E)!=EOF){
		memset(map,inf,sizeof(map));
		for(int i=0;i<E;i++){
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			map[x][y]=min(map[x][y],z);				//可能有重边,所以需要处理
			map[y][x]=map[x][y]; 					//无向图
		}
		for(int i=0;i<V;i++){					//注意初始化!自己到自己是0!
			map[i][i]=0;
		}
		for(int k=0;k<V;k++){
			for(int i=0;i<V;i++){
				for(int j=0;j<V;j++){
					map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
				}
			}
		}

		scanf("%d%d",&s,&t);
		if(map[s][t]==inf) puts("-1");
		else
			printf("%d\n",map[s][t]);

	}

	return 0;
} 

Dijkstra用来计算单源最短路。起点可变

算法思想:

用dis存从起点到每个点的最小距离

整个算法的流程:

dij():

1.初始化vis和dis

2.循环至少n-1次(因为还有n-1个遍没有加进去)

(1)找到没有加入的点中最小的dis

(2)标记这个点t

(3)更新dis(j:1->n)

dis[j]=min(dis[t]+map[t][j]);

main()

初始化处理。

例题:

poj2387

<pre name="code" class="cpp"><pre name="code" class="cpp">#include <cstdio>
#include <cstring>
using namespace std;
#define min(x,y) x<y?x:y
#define MAXN 105
#define inf 0x3f3f3f3f

int m,n;
int map[MAXN][MAXN];
bool vis[MAXN];
int dis[MAXN];
void dij(int s){
	//初始化
	memset(vis,false,sizeof(vis));
	for(int i=1;i<=n;i++){
		dis[i]=map[s][i];
	}
	dis[s]=0;
	vis[s]=true;
	//循环
	//1.找最小的dis
	//2.标记
	//3.更新 

	for(int j=0;j<=n;j++){
		int t,mi=inf;
		for(int i=1;i<=n;i++){
			if(!vis[i]&&mi>dis[i]){
				t=i;
				mi=dis[i];
			}
		}

		vis[t]=true;

		for(int i=1;i<=n;i++){
			dis[i]=min(dis[i],dis[t]+map[t][i]);
		}
	}
}

int main(){
	while(scanf("%d%d",&n,&m)!=EOF){
		if(n==0&&m==0) break;
		memset(map,inf,sizeof(map));
		for(int i=0;i<m;i++){
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			map[x][y]=min(map[x][y],z);
			map[y][x]=map[x][y];
		}
		dij(1);
		printf("%d\n",dis[n]);
	}

	return 0;
}


但是该便问只是涉及到了简单的最短路,如果需要输出路径呢?如果各个点有权值呢?如果不只一条最短路呢?

笔者是新手,容我下去自个看看,咱们下回分解^_^

时间: 2024-07-28 12:31:45

最短路Floyd(hdu1874),dijstra(poj2387)的相关文章

SDUT 2930-人活着系列之开会(最短路Floyd)

人活着系列之开会 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 人活着如果是为了事业,从打工的到老板的,个个都在拼搏,奋斗了多年终于有了非凡成就,有了一笔丰富的钱财.反过来说,人若赚取了全世界又有什么益处呢?生不带来,死了你还能带去吗?金钱能买保险,但不能买生命,金钱能买药品,但不能买健康,人生在世,还是虚空呀! 在苍茫的大海上,有很多的小岛,每个人都在自己的小岛上.又到了开会的时候了,鹏哥通过飞信告知了每个人,然后大家就开

【bzoj2324】[ZJOI2011]营救皮卡丘 最短路-Floyd+有上下界费用流

原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道路.据点分别从1到N标号.小智一行K人从真新镇出发,营救被困在N号据点的皮卡丘.为了方便起见,我们将真新镇视为0号据点,一开始K个人都在0号点. 由于火箭队的重重布防,要想摧毁K号据点,必须

UVa10048_Audiophobia(最短路/floyd)(小白书图论专题)

解题报告 题意: 求所有路中最大分贝最小的路. 思路: 类似floyd算法的思想,u->v可以有另外一点k,通过u->k->v来走,拿u->k和k->v的最大值和u->v比较,存下最小的值. #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #define inf 0x3f3f3f3f using namespace std;

POJ训练计划2253_Frogger(最短路/floyd)

解题报告 题意: 求0到1所有路中最大值最小的那个数. 思路: floyd. #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #define inf 0x3f3f3f3f using namespace std; int n,m,q; double mmap[210][210]; struct node { double x,y; } p[210]; doub

UVa10099_The Tourist Guide(最短路/floyd)(小白书图论专题)

解题报告 题意: 有一个旅游团现在去出游玩,现在有n个城市,m条路.由于每一条路上面规定了最多能够通过的人数,现在想问这个旅游团人数已知的情况下最少需要运送几趟 思路: 求出发点到终点所有路当中最小值最大的那一条路. 求发可能有多种,最短路的松弛方式改掉是一种,最小生成树的解法也是一种(ps,prime和dijs就是这样子类似的) #include <iostream> #include <cstdio> #include <cstring> #include <

ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)

这是一道非常好的题目,融合了很多知识点. ZOJ1232-Adventrue of Super Mario 这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔 题意就不累述了,注释有写,难点在于状态转移方程的确立和SPFA的过程 1 //最短路:Floyd+SPFA(BFS)+DP 2 //Time:20Ms Memory:336K 3 //题目很好,数据较弱,网上部分代码有些问题却能够A掉 4 //题意:超级马里奥要从A+B处背着公主以最短路程到达1处,其中1-A是村庄,剩下的是城堡

Problem B Codeforces 295B 最短路(floyd)

Description Greg has a weighed directed graph, consisting of n vertices. In this graph any pair of distinct vertices has an edge between them in both directions. Greg loves playing with the graph and now he has invented a new game: The game consists

SDUT 2929-人活着系列之芳姐和芳姐的猪(最短路Floyd)

人活着系列之芳姐和芳姐的猪 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 芳姐特别喜欢猪,所以,她特意养了m个猪圈,顺便在k条无向边,每条边有都有起点v,距离.....芳姐和猪们约定好,每天去一个固定猪圈去吃饭,芳姐为了不累着她可爱的猪们,想知道所有的猪吃饭走的最短路程是多少? 输入 第一行,猪的个数m(k(1<=k<=1200).(猪的编号为1..m) N+1行N头猪所在的猪圈号第n+k+1行:u.1<=w<

hdu1874 畅通project续 最短路 floyd或dijkstra或spfa

Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择.而某些方案要比还有一些方案行走的距离要短非常多.这让行人非常困扰. 如今,已知起点和终点.请你计算出要从起点到终点,最短须要行走多少距离. Input 本题目包括多组数据,请处理到文件结束. 每组数据第一行包括两个正整数N和M(0< N<200,0 < M<1000),分别代表现有城镇的数目和已