用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

dijkstra和spfa求单源最短路径

2016-10-27 作者: 云代码会员举报

[c++]代码库

#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>

using namespace std;

const int maxn = 500 + 5;
const int INF = 1e8;

struct Node
{
	int id;
	int dis;
	Node(int _id,int _dis):id(_id),dis(_dis){}
	bool operator < (const Node &b)const
	{
		return dis > b.dis;
	}
};

vector<Node> G[maxn];
int dis[maxn];
int vis[maxn];

void init()
{
	for(int i = 0;i < maxn;i++)
	{
		vis[i] = 0;
		dis[i] = INF;
		G[i].clear();
	}
}

void dijkstra(int v0)//找点,稠密图
{
	dis[v0] = 0;
	priority_queue<Node> pq;
	pq.push(Node(v0,0));
	while(!pq.empty())
	{
		Node ct = pq.top();
		pq.pop();
		if(vis[ct.id]) continue;
		vis[ct.id] = 1;
		for(int i = 0;i < G[ct.id].size();i++)
		{
			Node nt = G[ct.id][i];
			if(vis[nt.id]) continue;
			if(dis[nt.id] > dis[ct.id] + nt.dis)
			{
				dis[nt.id] = dis[ct.id] + nt.dis;
				pq.push(Node(nt.id,dis[nt.id]));
			}

		}
	}
}

void spfa(int v0)//找一遍边,稀疏图
{
	queue<int> q;
	q.push(v0);
	vis[v0] = 1;
	dis[v0] = 0;
	while(!q.empty())
	{
		int ct = q.front();
		q.pop();
		vis[ct] = 0;
		for(int i = 0;i < G[ct].size();i++)
		{
			Node nt = G[ct][i];
			if(dis[nt.id] > dis[ct] + nt.dis)
			{
				dis[nt.id] = dis[ct] + nt.dis;
				if(!vis[nt.id])
				{
					vis[nt.id] = 1;
					q.push(nt.id);
				}
			}
		}
	}
}


int main()
{
	int N,M;
	while(scanf("%d%d",&N,&M) != EOF)
	{
		init();
		for(int i = 0;i < M;i++)
		{
			int A,B,X;
			scanf("%d%d%d",&A,&B,&X);
			G[A].push_back(Node(B,X));
			G[B].push_back(Node(A,X));
		}
		int s,e;
		scanf("%d%d",&s,&e);
		//dijkstra(s);//78ms
		spfa(s);//0ms
		if(dis[e] != INF)
			printf("%d\n",dis[e]);
		else
			printf("-1\n");
	}
	return 0;
}

[源代码打包下载]




网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...