poj 2253 最短路

题目链接:http://poj.org/problem?id=2253

题目大意:青蛙要从一个石头跳到另一个石头上,要求跳的路线中最大跳(即某条路线中最远的那一步)的最小值,起始位置在第一个点,目的位置在第二个点,中间点在紧接着的输入

思路:(1)用floyd算法,求所有点之间的最大跳的最小值,最后输出a[0][1],即起始与终止位置的最小值,采用传递闭包的思路,时间复杂度较高,但代码简单

(2)Dijkstru的变形,即求两点间的最短距离,只是最短距离的求法有变,当前加入一个点时,松弛方法不同,时间复杂度降低了

#include #include #define N 205 double a[N][N]; int n,x[N],y[N]; double dist(int i,int j) { return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } double max(double x,double y) { return x>y?x:y; } double min(double x,double y) { return x>y?y:x; } void floyd() { int i,j,k; for(k=0;k

#include #include #include #define N 205 #define MAX 100000000 double a[N][N],dis[N]; int n,x[N],y[N],s[N]; double dist(int i,int j) { return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } double max(double a,double b) { if(a>b) return a; return b; } double Dijkstru() { int i,j,u; double minDis; for(i=0;i

下面是用krustral算法写的,目前是wrong answer,有待继续思考

#include #include #include #define N 205 double a[N][N]; int k,n,x[N],y[N],father[N]; struct node{ int x,y; double cost; }edge[40010]; double dist(int i,int j) { return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } int cmp(const void *a,const void *b) { struct node *c=(struct node *)a; struct node *d=(struct node *)b; return c->cost-d->cost; } int find(int x) { int q,r=x; while(father[r]!=r) r=father[r]; while(x!=r) { q=father[x]; father[x]=r; x=q; } return r; } void Union(int a,int b) { int fa,fb; fa=find(a); fb=find(b); if(fa!=fb) father[fa]=fb; } double krustral() { int i,fx,fy; qsort(edge,k,sizeof(edge[0]),cmp); for(i=0;i

你可能感兴趣的:(ACM之图论)