Skip to content

ccd 交通规划 #1

@kingjane

Description

@kingjane

2017-03-15 7 50 01
2017-03-15 7 50 28
解题方法:Dijkstra+优先队列

//
//  main.cpp
//  demo
//
//  Created by King_Jane on 2017/3/13.
//  Copyright © 2017年 King_Jane. All rights reserved.
//

#include<cstdio>
#include<queue>
#include<vector>
#define MAXN 100005
#define INF 0x7fffffff
int n,m;
using namespace std;
struct Point
{
    int u;
    int dist;
    Point(int uu,int d){
        u=uu,dist=d;
    }
    //优先队列 ,按dist从小到大
    bool operator < (const Point &a) const {
        return dist > a.dist;
    }
};
struct Edge
{
    int v;
    int cost;
    Edge(int vv,int c){
        v=vv,cost=c;
    }
};
vector<Edge> G[MAXN];
bool vis[MAXN];
int disto[MAXN];
int costo[MAXN];

void Dijkstra(int s)
{
    //源是1
    for(int i=1;i<=n;i++){
            // 初始化 都没访问,dist都是最大
        vis[i]=false;
        disto[i]=costo[i]=INF;
    }
    disto[s]=0;
    costo[s]=0;
    priority_queue<Point> queue;
    queue.push(Point(s,0));
    while(!queue.empty()){
        Point p=queue.top();//选择dist最小的点
        queue.pop();
        int u=p.u;
        if(!vis[u]){ //没有在集合S中
            for(int i=0;i<G[u].size();i++){//遍历u相邻的点
                int v=G[u][i].v;
                int co=G[u][i].cost;
                if(!vis[v]){ //没有在S中
                    if(disto[v]>disto[u]+co){
                        disto[v]=disto[u]+co;//更新dist
                        queue.push(Point(v,disto[v]));
                        costo[v]=co;
                    }
                    if(disto[v]==disto[u]+co){
                        costo[v]=min(costo[v],co);//贪心,相同,选择这一段最小的
                    }
                }
            }
        }
        vis[u]=true;
    }
}
int main()
{
    int u,v,c;
    scanf("%d%d",&n,&m);
    while(m--){
        //邻接表 存储图
        scanf("%d%d%d",&u,&v,&c);
        G[u].push_back(Edge(v,c));
        G[v].push_back(Edge(u,c));
    }
    Dijkstra(1);
    int ans=0;
    for(int i=2;i<=n;i++)
        ans+=costo[i];
    printf("%d",ans);
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions