试题编号: 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;
}