dijkstra和spfa

dijstra是一个求单源最短路的一种方法,用优先队列求最短路虽然不如数组实现方便,但是比用邻接矩阵方法要快,理由很简单,满足入队,不满足便不会入队,这里代码基于刘汝佳的《算法竞赛入门经典第2版》上的代码补全,唯一的不同是一处的vector改成了数组,当然无所谓啦,只是因为在代码补全时没有看书自己看着补写。

 
  

#include
#include
#include
#include
using namespace std;
const int maxnode=100000; 
struct edge{
	int to;
	int dist;
	
	
	
}edges[maxnode];
    int bb;
int p[maxnode];
struct headnode{
	int d,u;
	bool operator <(const headnode& rhs)const{
		return d>rhs.d;//队列判断 
	}
};
vectorG[maxnode];
int n;
int d[maxnode];
const int inf=1000000000;
bool done[maxnode];
void dijkstra(int s){
	priority_queueQ;
	for(int i=1;i<=n;i++)d[i]=inf;//初始化 
	d[s]=0;
	memset(done,0,sizeof(done));
	Q.push((headnode){0,s});
	while(!Q.empty()){
		headnode x=Q.top();Q.pop();
		int u=x.u;
		if(done[u])continue;//避免重复入队,例如a更新b,入队,b在查找a时就会跳过 
		done[u]=true;
		for(int i=0;id[u]+e.dist){
				d[e.to]=d[u]+e.dist;
				p[e.to]=G[u][i];
				Q.push((headnode){d[e.to],e.to});
			}
		}
	}
}
//e=edges[g[u][i]]

int main(){
	int num=0;
	int a,b,dis;//from,to,dis 
    cin>>n;//dian
    cin>>bb;//bian
    for(int i=0;i>a>>b>>dis;//a->b;
    	edges[++num].to=b;
    	G[a].push_back(num);
    	edges[num].dist=dis;
		edges[++num].to=a;//b->a;
    	G[b].push_back(num);
    	edges[num].dist=dis;
    }
    cin>>a;
   
    dijkstra(a);
	for(int i=1;i<=n;i++){
		cout<
--------------------------------------spfa-----------

#include
using namespace std;
const int maxnode=100000;
int cnt[maxnode];
int inq[maxnode];
int n;
int d[maxnode];
const int inf=1000000000;
vectorG[maxnode];
struct edge{
	int to,dist;
}edges[10000];
int p[10000];
bool bellman(int s){
	queueQ;
	memset(inq,0,sizeof(inq));
	memset(cnt,0,sizeof(cnt));
	for(int i=1;i<=n;i++)d[i]=inf;
	d[s]=0;
	inq[s]=true;
	Q.push(s);
	while(!Q.empty()){
		int u=Q.front();Q.pop();
		inq[u]=false;
		for(int i=0;id[u]+e.dist){
				p[e.to]=G[u][i];
				d[e.to]=d[u]+e.dist;
				if(!inq[e.to]){Q.push(e.to);
				inq[e.to]=true;
				//cout<<"la"<n)return false;
				
				}
			}
		}
	}
	return true;
}
int main(){
	int num=0;
	cin>>n;//d
	int b;
	cin>>b;
	int a,c,dis;
	for(int i=1;i<=b;i++){
		cin>>a>>c>>dis;
		edges[++num].to=a;
		edges[num].dist=dis;
		G[c].push_back(num);
		edges[++num].to=c;
		edges[num].dist=dis;
		G[a].push_back(num);
		
	}
	int x;
	cin>>x;
	bellman(x);
	for(int i=1;i<=n;i++)cout<

依照题意修改代码
 
 

你可能感兴趣的:(c语言,dijkstra,算法,spfa,最短路)