ACM-图论-最短路dijsktra poj2253

2024-06-07 15:18

本文主要是介绍ACM-图论-最短路dijsktra poj2253,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这题折磨了我一整天,一直撞南墙,疯狂改不同的小地方,再提交,最后,看别人的代码,发现是精度问题!!!!!double(%lf)计算—->float(%f)输出

题意:青蛙(单源点)分步跳跃到(终点)
每条路(源到终)定义权值为:各个路段中的最大值
求所有路中,权值最小的路,输出权值dis[n]
模板题,dijsktra;
希望好心的英语大佬可以给我说一下,题目中怎么表达是float输出而不是double


1.设置点

struct node{double x,y;//记录dis用 node(){}//等等要形成数组 
};
node no[205];

2.简化

double mul(node a,node b){//变成double double f=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);return sqrt(f);
}

3.main
模板:

多组输入{输入点初始化边edge(边权值)dij()输出dis[终点]
}

这题的套用

int z=1;//freopen("1.txt","r",stdin);while(scanf("%d",&n)!=EOF&&n){for(int i=1;i<=n;i++){scanf("%lf %lf",&no[i].x,&no[i].y);} init();dij();printf("Scenario #%d\nFrog Distance = %.3f\n\n",z++,dis[2]);////!!!!!精度问题,坑了我半天 }

4.很重要的初始化

void init(){for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){if(i==j)edge[i][j]=0;else edge[i][j]=edge[j][i]=mul(no[i],no[j]);//是无向图记得取反 //%d输出%lf会变成0 //min不可以直接对比double和int}}
}

5.我是重点dij
模板

{init(vis)init(dis)(源点到终点的距离)vis[源点]=1dis[源点]=0for(i:1-n){temp,curfor(1-n){找到从i出发的最小邻接点,temp,cur标记}vis[cur]=1for(1-n){更新各个点的dis}}
}

这题的套用

void dij(){memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++)dis[i]=edge[1][i];//全改成edgevis[1]=true;dis[1]=0;for(int i=1;i<n;i++){//<ndouble temp=inf;int cur=0;for(int j=1;j<=n;j++){if(!vis[j]&&temp>dis[j]){//>temp=dis[j];cur=j;}}vis[cur]=1;//printf("cur=%d  dis[cur]=%.3lf\n",cur,dis[cur]);//路中最大,找各路最小for(int j=1;j<=n;j++){if(!vis[j]&&dis[j]>max(dis[cur],edge[cur][j])){dis[j]=max(dis[cur],edge[cur][j]);}}}
}

6.数据范围

#define inf 0x3f3f3f3f
int s,n,m;
double dis[210],edge[210][210];
//点《=1000,边《=2000 
bool vis[210];

以上是我撞破头得来的dijsktra的经验之谈,欢迎大家参考!

这篇关于ACM-图论-最短路dijsktra poj2253的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039544

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

poj 1511 Invitation Cards(spfa最短路)

题意是给你点与点之间的距离,求来回到点1的最短路中的边权和。 因为边很大,不能用原来的dijkstra什么的,所以用spfa来做。并且注意要用long long int 来存储。 稍微改了一下学长的模板。 stack stl 实现代码: #include<stdio.h>#include<stack>using namespace std;const int M

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

poj 1502 MPI Maelstrom(单源最短路dijkstra)

题目真是长得头疼,好多生词,给跪。 没啥好说的,英语大水逼。 借助字典尝试翻译了一下,水逼直译求不喷 Description: BIT他们的超级计算机最近交货了。(定语秀了一堆词汇那就省略吧再见) Valentine McKee的研究顾问Jack Swigert,要她来测试一下这个系统。 Valentine告诉Swigert:“因为阿波罗是一个分布式共享内存的机器,所以它的内存访问

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

hdu 3790 (单源最短路dijkstra)

题意: 每条边都有长度d 和花费p,给你起点s 终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。 解析: 考察对dijkstra的理解。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstrin

poj 3255 次短路(第k短路) A* + spfa 或 dijkstra

题意: 给一张无向图,求从1到n的次短路。 解析: A* + spfa 或者 dijkstra。 详解见上一题:http://blog.csdn.net/u013508213/article/details/46400189 本题,spfa中,stack超时,queue的效率最高,priority_queue次之。 代码: #include <iostream>#i

poj 2449 第k短路 A* + spfa

poj 2449: 题意: 给一张有向图,求第k短路。 解析: A* + spfa。 一下转自:http://blog.csdn.net/mbxc816/article/details/7197228 “描述一下怎样用启发式搜索来解决K短路。 首先我们知道A*的基础公式:f(x)=g(x)+h(x);对h(x)进行设计,根据定义h(x)为当前的x点到目标点t所需要的实际距

poj 3259 最短路负环

John的农场里N块地,M条路连接两块地,W个虫洞,虫洞是一条单向路,会在你离开之前把你传送到目的地,就是当你过去的时候时间会倒退Ts。我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前的自己。简化下,就是看图中有没有负权环。有的话就是可以,没有的话就是不可以了。 import java.io.BufferedReader;import java.io.InputStream;

POJ1724最短路

n个点,拥有总的价值money m条边(u,v,len ,cost),长度len,代价cost 求不超过money的代价条件下最短路。 public class Main {public static void main(String[] args) {new Task().solve();}}class Task {InputReader in = new InputReader