【POJ3377】Ferry Lanes 最短路

我只是贴一下手写堆优化的dij模板,虽然,它,TLE了……****

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 2001000
#define inf 0x3f3f3f3f
#define longlong int
using namespace std;
struct Katarina
{
	int v,next;
	longlong len;
}e[N<<2];
int head[N],cnt;
void add(int u,int v,longlong len)
{
	cnt++;
	e[cnt].v=v;
	e[cnt].len=len;
	e[cnt].next=head[u];
	head[u]=cnt;
}
struct Fiona
{
	longlong f;
	int v;
	bool operator < (const Fiona &a)const
	{return f<a.f;}
	bool operator >= (const Fiona &a)const
	{return f>=a.f;}
	bool operator > (const Fiona &a)const
	{return f>a.f;}
	Fiona(longlong _f,int _v):f(_f),v(_v){}
	Fiona(){}
};
struct Heap
{
	Fiona w[N];
	int cnt,crs[N];
	void init(){cnt=0;memset(crs,0,sizeof(crs));}
	void pushup(int &x){while((x>>1)&&w[x>>1]>w[x])swap(w[x>>1],w[x]),crs[w[x].v]=x,x>>=1;}
	void pushdown(int &x)
	{
		while((x<<1)<=cnt)
		{
			int son=(x<<1==cnt)?(x<<1):(w[x<<1]<w[x<<1|1]?(x<<1):(x<<1|1));
			if(w[son]>=w[x])break;
			else swap(w[x],w[son]),crs[w[x].v]=x;
			x=son;
		}
	}
	void push(Fiona X)
	{
		if(!crs[X.v])
		{
			w[++cnt]=X;
			pushup(crs[X.v]=cnt);
		}
		else
		{
			w[crs[X.v]]=X;
			pushup(crs[X.v]);
		}
	}
	Fiona top()/*add to a pop*/
	{
		Fiona ret=w[1];
		crs[w[1].v]=0;
		w[1]=w[cnt--];
		if(cnt)pushdown(crs[w[1].v]=1);
		return ret;
	}
}heap;
longlong dist[N];
bool visit[N];
int n;
longlong dij(int s,int t)
{
	int i,u,v,round;
	heap.init();
	memset(dist,0x3f,sizeof(dist));
	memset(visit,0,sizeof(visit));
	dist[s]=0;
	heap.push(Fiona(dist[s],s));
	for(round=1;round<=n;round++)
	{
		Fiona U=heap.top();
		u=U.v;
		visit[u]=1;
		for(i=head[u];i;i=e[i].next)
		{
			v=e[i].v;
			if(!visit[v]&&dist[v]>dist[u]+e[i].len)
			{
				dist[v]=dist[u]+e[i].len;
				heap.push(Fiona(dist[v],v));
			}
		}
	}
	return dist[t];
}
int main()
{
//	freopen("test.in","r",stdin);
//	freopen("1.out","w",stdout);
	int i,a,b,c,d;
	int s,t,temp;
	while(scanf("%d",&n),n)
	{
		n++;cnt=0;
		memset(head,0,sizeof(head));
		scanf("%d%d%d%d",&a,&b,&c,&d);
		s=a*n+b+1;
		t=c*n+d+1;
		for(i=1;i<n;i++)
		{
			scanf("%d",&temp);
			add(i,i+1,temp);
			add(i+1,i,temp);
		}
		for(i=1;i<=n;i++)
		{
			scanf("%d",&temp);
			add(i,i+n,temp);
			add(i+n,i,temp);
		}
		for(i=n+1,n<<=1;i<n;i++)
		{
			scanf("%d",&temp);
			add(i,i+1,temp);
			add(i+1,i,temp);
		}
		cout<<dij(s,t)<<endl;
	}
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}
时间: 2024-08-28 10:02:51

【POJ3377】Ferry Lanes 最短路的相关文章

hdu3461Marriage Match IV 最短路+最大流

//给一个图.给定起点和终点,仅仅能走图上的最短路 //问最多有多少种走的方法.每条路仅仅能走一次 //仅仅要将在最短路上的全部边的权值改为1.求一个最大流即可 #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<vector> using namespace std ; const int inf = 0x3f3f3f3f ; const

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

ACM/ICPC 之 昂贵的聘礼-最短路解法(POJ1062)

//转移为最短路问题,枚举必经每一个不小于酋长等级的人的最短路 //Time:16Ms Memory:208K #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f #define MAX 105 int lim, n; int p[M

图论(A*算法,K短路) :POJ 2449 Remmarguts&#39; Date

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

hdu4725 拆点+最短路

题意:有 n 个点,每个点有它所在的层数,最多有 n 层,相邻两层之间的点可以互相到达,消耗 c (但同一层并不能直接到达),然后还有一些额外的路径,可以在两点间互相到达,并且消耗一定费用.问 1 点到 n 点的最小花费 将每一层拆成两个点,分别为进入层和出发层,然后相邻层的出发层可以指向进入层,花费 c,每个点可以到达其出发层,而进入层可以到达该点,花费 0 ,最后建立其余双向边,最短路 1 #include<stdio.h> 2 #include<string.h> 3 #in

hdu3416 最短路+最大流

题意:有 n 点 m 边,有出发点 A 到达点 B ,只允许走原图中的最短路,但每条边只允许被走一次,问最多能找出多少条边不重复的最短路 一开始做到的时候瞎做了一发最短路,WA了之后也知道显然不对,就放着了,后来打了今年的多校,再做到的时候发现和多校第一场的1007一样的……最短路+网络流就行了,只不过第一次做这个的时候我还不知道网络流是啥,不会做也正常啦. 首先对于原图跑一遍最短路求出每个点距离 A 点的最短路,然后对于每一条边,如果它的权值等于它连接的两点的最短路的差值的时候,就说明这条路是

【啊哈!算法】算法7:Dijkstra最短路算法

上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图中的1号顶点到2.3.4.5.6号顶点的最短路径. <ignore_js_op> 与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下. <ignore_js_op> 我们还需要用一个一维数组dis来存储1号顶点到其余各个顶点的初始路程,如下.

HDU ACM 2544 最短路-&gt;最短路

最短路,简单题,floyd实现,在求最短路时一定要是是最大节点编号maxnum而不是输入的n,否则是错的. #include<iostream> using namespace std; int map[105][105]; //无向图 void Init() { int MAX=1000000,i,j; for(i=1;i<=104;i++) for(j=1;j<=104;j++) if(i==j) map[i][j]=0; else map[i][j]=MAX; } void