最短路(蓝桥杯)

问题描述

给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。

输入格式

第一行两个整数n, m。

接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。

输出格式
共n-1行,第i行表示1号点到i+1号点的最短路。
样例输入
3 3
1 2 -1
2 3 -1
3 1 2
样例输出
-1
-2
数据规模与约定

对于10%的数据,n = 2,m = 2。

对于30%的数据,n <= 5,m <= 10。

对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。

 
是有向图,可以用链式前向星保存数据。
#include <stdio.h>  
#include <queue>  

using namespace std;  

#define L 200200
int inf=1<<30;

int dis[L];   //保存每个节点到起点的位置 
int vis[L];   //保存节点是否还在栈内 
int head[L];  //保存边 

struct stu{
    int x,y,w,next;
}e[L];

void bb1(int k)
{
    queue<int>q;  //创建队列 
    dis[k]=0;
    vis[k]=1;
    q.push(k);    //入队 
    while(!q.empty())   //队列不为空时 
    {
        int u,v;
        u=q.front();    //获取队顶元素 
        q.pop();       //弹出队顶元素 
        vis[u]=0;    //出队后还可重复入队 
        for(int i=head[u];i!=-1;i=e[i].next)  //从当前点找与它相连的点 
        {
            v=e[i].y;
            if(dis[v]>dis[u]+e[i].w&&!vis[v]) // 小于当前值就更新 
            {
                dis[v]=dis[u]+e[i].w;
                q.push(v);   //入队 
                vis[v]=1;   //防止队内有相同的两个节点 
            }
        }
    }
}

int main()
{
    int n,m,x,y,w;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        //数组赋初值 
        dis[i]=inf;
        vis[i]=0;
        head[i]=-1;
    }
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&x,&y,&w);
        //把起点终点权值保存进结构体数组 
        e[i].x=x;
        e[i].y=y;
        e[i].w=w;
        //////////////////// 
        e[i].next=head[x];
        head[x]=i;
        // 这里一开始可能有点难理解 
        /*
            起点   终点    权值 
            1         2         -1
            1         3         6
            1         4          7
            1         5         -8
            把这几组数据带入写出来,
            结合bb1()数组中for循环就能看出来
            e[i].next和head[]数组的作用了 
        */ 
        ////////////////////
    }
    bb1(1);  //从起点开始找,和BFS宽搜有点像 
    for(int i=2;i<=n;i++)
    {
        printf("%d\n",dis[i]);
    }
    return 0;
}

 

 

 

 

 
posted @ 2017-04-04 16:39  X_1996  阅读(354)  评论(0)    收藏  举报