最短路模板[spfa][dijkstra+堆优化][floyd]

借bzoj1624练了一下模板(虽然正解只是floyd)

spfa:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int INF=100001;
const int maxm=10001,maxn=101;

int n,m,x,y,w;
long long ans=0;
int a[maxm];
int dist[maxn];
bool vis[maxn];
struct edge{
	int to,w;
	edge(int _to,int _w){to=_to;w=_w;}
};
vector <edge> g[maxm];

void spfa(int x){
	queue<int> q;
	memset(dist,63,sizeof(dist));
	memset(vis,false,sizeof(vis));
	dist[x]=0;
	vis[x]=1;
	q.push(x);

	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=0;
		int l=g[u].size();
		for(int i=0;i<l;i++){
			int v=g[u][i].to;
			if(dist[v]>dist[u]+g[u][i].w){
				dist[v]=dist[u]+g[u][i].w;
			    if(!vis[v]){
			    	vis[v]=1;q.push(v);
			    }
			}
		}
	}
}

int main(){
	freopen("data.in","r",stdin);
	freopen("text.out","w",stdout);
	//freopen("data.txt","r",stdin);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=n;j++){
	    	scanf("%d",&w);
	    	if(i!=j) g[i].push_back(edge(j,w));
	    }
	for(int i=1;i<m;i++){
		spfa(a[i]);
		ans+=dist[a[i+1]];
	}
	cout<<ans;
	return 0;
}

  

dijkstra+priority_queue:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int INF=100001;
const int maxm=10001,maxn=101;

int n,m,x,y,w;
long long ans=0;
int a[maxm];
int dist[maxn];
struct edge{
	int to,w;
	edge(int _to,int _w){to=_to;w=_w;}
};
vector <edge> g[maxm];
typedef pair<int,int> P;

void dijkstra(int x){
	priority_queue< P , vector <P> , greater<P> > q;
	memset(dist,63,sizeof(dist));
	dist[x]=0;
	q.push(P(0,x));

	while(!q.empty()){
		P u=q.top();
		int x=u.second;
		q.pop();
		if(dist[x]<u.first) continue;
		int l=g[x].size();
		for(int i=0;i<l;i++){
			int v=g[x][i].to;
			if(dist[v]>dist[x]+g[x][i].w){
				dist[v]=dist[x]+g[x][i].w;
			    q.push(P(dist[v],v));
			}
		}
	}
}

int main(){
	freopen("danger.in","r",stdin);
	freopen("danger.out","w",stdout);
	//freopen("data.txt","r",stdin);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=n;j++){
	    	scanf("%d",&w);
	    	if(i!=j) g[i].push_back(edge(j,w));
	    }
	for(int i=1;i<m;i++){
		dijkstra(a[i]);
		ans+=dist[a[i+1]];
	}
	cout<<ans;
	return 0;
}

  
floyd:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
int n,m,i,j,k,ans,f[102][102],a[10002];
int main(){
  cin>>n>>m;
  for(i=1;i<=m;i++)scanf("%d",&a[i]);
  for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
    scanf("%d",&f[i][j]);
  for(k=1;k<=n;k++)
  for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
    f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
  for(i=2;i<=m;i++)ans+=f[a[i-1]][a[i]];
  cout<<ans;
  return 0;
}

  

时间: 2024-12-27 22:43:54

最短路模板[spfa][dijkstra+堆优化][floyd]的相关文章

POJ 3013 Big Christmas Tree【最短路变形,DIjkstra堆优化+spfa算法】

Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 23064   Accepted: 4987 Description Christmas is coming to KCM city. Suby the loyal civilian in KCM city is preparing a big neat Christmas tree. The simple structure of t

ACM-最短路(SPFA,Dijkstra,Floyd)之最短路——hdu2544

***************************************转载请注明出处:http://blog.csdn.net/lttree*************************************** 最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28761    Accepted Submissio

hdu 2544 单源最短路问题 dijkstra+堆优化模板

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41168    Accepted Submission(s): 17992 Problem Description 在每年的校赛里.全部进入决赛的同学都会获得一件非常美丽的t-shirt.可是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的.所以如今他们想要寻

Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] Description Input Output Sample Input 2 1 1 2 1 1 2 2 Sample Output 5 HINT N<=20000,M<=100000 Source dijkstra+堆优化+分层图 把所有的横向和纵向分开看.跑最短路即可. 注意:N这么大,不能写

【日常学习】【Dijkstra堆优化】codevs2038 香甜的黄油题解

转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake 先放上题目,出自USACO 题目描述 Description 农夫John发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油.当然,他将付出额外的费用在奶牛上. 农夫John很狡猾.他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场.他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶. 农

Heap+Dijkstra堆优化的Dijkstra

前面说到"原生的Dijkstra",由于Dijkstra采用的是贪心策略,在贪心寻找当前距离源结点最短的结点时需要遍历所有的结点,这必然会导致效率的下降,时间复杂度为n^n.因此当数据量较大时会消耗较长时间.为了提高Dijkstra的效率,只有对Dijkstra的贪心策略进行改进. 由于Dijkstra采用的贪心策略是每次寻找最短距离的结点并将其放入存放所有已知最短距离结点的S集合中,可以联想到堆以及优先级队列这些数据结构,这些结构都能非常高效地提供当前状态距离最短的结点.实践也可以证

Poj 1151 Invitation Cards dijkstra 堆优化

很裸的最短路,不过节点数和边数都是1e6,直接dij肯定是不行了,稀疏图用heap优化一下就好 o(╯□╰)o注意STL里面的优先队列是优先级大的(值大的)在前面的,一开始没注意WA了好几发,哎,太粗心了 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #inc

[Usaco2010 Feb]Chocolate Giving 最短路dijkstra+堆优化

本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 题目:传送门 最短路板子题:迪杰斯特拉+堆优化 注意:因为我建的是大根堆,所以要将距离取负,再存入大根堆堆中,这样队首就是最小值 直接套模板即可 code: 1 #include<bits/stdc++.h> 2 #define inf 0x3f3f3f3f 3 #pragma GCC optimize(3) 4 const int N=50005; 5 const int M=200002; 6 using namespace st

[转]浅谈dijkstra堆优化

众所周知的,dijkstra是图论算法中求单源最短路的一种简单求法.可能有人会说SPFA比dijkstra要实用,而且可以用于求存在负边权的情况,但是dijkstra有着他的优点——其运行速度上优于SPFA. (PS.需要堆进行优化.) 我们先看一道经典(水)题: 平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间.其中的一些点之间有连线. 若有连线,则表示可从一个点到达另一个点,即两点之间有通路,通路的距离为两点之间的直线距离.现在的任务是找出从入点到出点之间的最短路