ccf 201609-4 交通规划

 

 

 

 

 

附上代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define inf 0xfffffff
int n, m;
typedef struct NODE
{
    int to;
    int cost;
    friend bool operator < (const NODE &a, const NODE &b) {
        return a.cost > b.cost;
    }
}node;
typedef struct Edge
{
    int from;
    int next;
    int to;
    int w;
    int value;
} edge;
edge maps[10000005];
int head[100050];
int dist[100050];
int vids[100050];
int cnt;
void creat ()
{
    for(int i=0; i<100050; i++)
        head[i]=-1;
    cnt=0;
}
void add(int u,int v,int w)
{
    maps[cnt].from = u;
    maps[cnt].to=v;
    maps[cnt].w=w;
    maps[cnt].value = w;
    maps[cnt].next=head[u];///一开始放置为-1,-1的条件就可以跳出
    ///下一步接着储存,head[u]的值,就是前面的位置
    head[u]=cnt++;///head[u]会得到这条线的值
}
int dijkstra(int s,int t)
{
    for(int i=0; i<100050; i++)
    {
        vids[i]=0;
        dist[i]=inf;
    }
    priority_queue<node>que;
    node begins;
    begins.to=s;
    begins.cost=0;
    que.push(begins);
    while(!que.empty())
    {
        node ends=que.top();
        que.pop();
        if(!vids[ends.to])
        {
            vids[ends.to]=1;
            dist[ends.to]=ends.cost;
            for(int i = head[ends.to]; ~i; i = maps[i].next)
            {
                int to = maps[i].to, w = maps[i].w;
                maps[i].w = ends.cost + w;
                if(!vids[to])
                {
                    node ans;
                    ans.to=to;
                    ans.cost=ends.cost+w;
                    que.push(ans);
                }
                
            }
        }
    }
    if(dist[t] == inf)
    {
        return -1;
    }
    else
    {
        return dist[t];
    }
}
bool cmp(const edge & a, const edge & b)
{
    if(a.w != b.w)
    {
        return a.w < b.w;
    }
    return a.value < b.value;
}
int pre[100050];
void Init()
{
    for(int i=1; i<=m; i++)
        pre[i]=i;
}
int finds(int x)
{
    if(pre[x]==x)
        return x;
    else
        return pre[x]=finds(pre[x]);
}
void unionjoin(int x,int y)
{
    int u=finds(x);
    int v=finds(y);
    if(u==v)
        return ;
    else
        pre[u]=v;
}
bool same(int x,int y)
{
    return finds(x)==finds(y);
}
long long kruskal()
{
    long long ans=0;
    sort(maps,maps + 2 * m,cmp);
    for(int i = 0; i< 2 * m; i++)
    {
        if(!same(maps[i].from,maps[i].to))
        {
            unionjoin(maps[i].from,maps[i].to);
            ans+=maps[i].value;
        }
        else
            continue;
    }
    return ans;
}

int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        creat();
        for(int i = 0; i < m; i ++) {
            int u, v, w;
            scanf("%d%d%d",&u, &v, &w);
            add(u, v, w);
            add(v, u, w);
        }
        dijkstra(1, n);
        Init();
        long long re = kruskal();
        printf("%lld\n",re);
    }
    return 0;
}

 

posted @ 2018-09-20 19:57  moxin0509  阅读(472)  评论(0编辑  收藏  举报