csp 201609-4 交通规划

最短路问题

属于修改最短路更新操作的题目

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 10010
struct node
{
    int v;
    int w;
    node(int _v=0,int _w=0):v(_v),w(_w) {};
    bool operator < (const node &a) const
    {
        return w>a.w;
    }
};

struct Edge
{
    int v;
    int w;
    Edge(int _v=0,int _w=0):v(_v),w(_w) {};
};

vector<Edge> E[maxn];
int dis[maxn];
int prec[maxn];
bool vis[maxn];
int n,m;

void addedge(int u,int v,int w)
{
    E[u].push_back(Edge(v,w));
    E[v].push_back(Edge(u,w));
}

void djs(int st)
{
    memset(dis,inf,sizeof dis);
    memset(vis,false,sizeof vis);
    memset(prec,inf,sizeof prec);
    priority_queue<node> q;
    node a(st,0);
    q.push(a);
    node t;
    int cnt=0;
    while(!q.empty())
    {
        t=q.top();
        q.pop();
        int u=t.v;
        int w=t.w;
        if(vis[u]) continue;
        vis[u]=true;
        dis[u]=w;
        cnt++;
        for(int i=0;i<E[u].size();i++)
        {
            if(!vis[E[u][i].v])
            {
                if(dis[E[u][i].v]>dis[u]+E[u][i].w)
                {
                    dis[E[u][i].v]=dis[u]+E[u][i].w;
                    prec[E[u][i].v]=E[u][i].w;
                    q.push(node(E[u][i].v,dis[E[u][i].v]));
                }
                else if(dis[E[u][i].v]==dis[u]+E[u][i].w)
                {
                    prec[E[u][i].v]=min(prec[E[u][i].v],E[u][i].w);
                }
            }
        }
        if(cnt==n) break;
    }
}

int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        addedge(u,v,w);
    }
    djs(1);
    int ans=0;
    for(int i=2;i<=n;i++)
      ans+=prec[i];
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hzaukotete/article/details/84990580
今日推荐