交通规划

试题编号: 201609-4
试题名称: 交通规划
时间限制: 1.0s
内存限制: 256.0MB

Dijstra算法

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=10005;
const long long INF=1<<30;
int n,m;
long long d[maxn];
bool visit[maxn];
int p[maxn];//存储点到源点路径的前一节点
struct Node{
	int id;
	long long wgt;
};
vector< vector<Node> >G(maxn);

long long dij(int s)
{
	memset(visit,false,sizeof(visit));
	fill(d,d+maxn,INF);
	long long rtn=0;
	d[s]=0;
	for(int i=0;i<n;++i)
	{
		int MIN=INF;
		int u=-1;
		for(int j=1;j<=n;++j)
		{
			if(!visit[j])
				if(MIN>d[j])
				{
					MIN=d[j];
					u=j;
					}	
		}
		if(u==-1)
			return rtn;
		visit[u]=true;
		if(u!=s)
	 		rtn=rtn+d[u]-d[p[u]];
		
		for(int k=0;k<G[u].size();++k)
		{
			if(!visit[G[u][k].id])
				if(d[u]+G[u][k].wgt<d[G[u][k].id])
				{
					d[G[u][k].id]=d[u]+G[u][k].wgt;
					p[G[u][k].id]=u;
				}
				else if(d[u]+G[u][k].wgt==d[G[u][k].id])//松弛时,当有多条路径离源点距离相同时,选择边短的
				{
					if(G[u][k].wgt<d[G[u][k].id]-d[p[G[u][k].id]])
						d[G[u][k].id]=d[u]+G[u][k].wgt;
						p[G[u][k].id]=u;
				}
		}
		
	}
	return rtn;
	
}
int main()
{
	cin>>n>>m;
	for(int i=0;i<m;++i)
	{
		int a,b,c;
		Node N1,N2;
		cin>>a>>b>>c;
		N1.id=b;
		N1.wgt=c;
		N2.id=a;
		N2.wgt=c;
		G[a].push_back(N1);
		G[b].push_back(N2);
	}
	long long ans=dij(1);
	cout<<ans;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值