洛谷 P3371 P4779 单源最短路径 堆优化

https://www.luogu.org/problemnew/show/P3371

https://www.luogu.org/problemnew/show/P4779

这两道题都是有向图,改成无向图也很简单,读入边的时候当做无向边处理就好了。没有测试朴素版的迪杰斯特拉,看数据范围O(n^2)应该是会超时的吧。

给出代码:

#include<iostream>
#include<cstdio>
#include<stack>
#include<cmath>
#include<cstring>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;

const int maxn=100005;
int n,m;
int vis[maxn],dis[maxn];

struct Edge
{
    int to; //尾结点
    int value;  //权值
};
vector<Edge> edge[200005];

struct node
{
	int id;
	int w;
	bool operator < (const node&b)const //距离小的在前面
	{
	    return w>b.w;
	}
};

void Dijkstra(int s);   //传入起点

int main()
{
    int s;
    scanf("%d%d%d",&n,&m,&s);//顶点数 边数 起点
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        Edge e;
        e.to=y;	//尾结点
        e.value=z;	//距离
        edge[x].push_back(e);
    }
    Dijkstra(s);
    for(int i=1;i<=n;i++)
    {
        if(dis[i]!=INF)
            printf("%d ",dis[i]);
        else
            printf("2147483647 ");//不可达
    }
    return 0;
}

void Dijkstra(int s)
{
    memset(vis,0,sizeof(vis));
    memset(dis,INF,sizeof(dis));
    priority_queue<node> q;
    node a;
    a.id=s,a.w=0;
    q.push(a);
    dis[s]=0;	//起始结点
    while(!q.empty())
    {
        node now=q.top();
        q.pop();
        int id=now.id;
	if(vis[id])
	    continue;
	vis[id]=1;
	for(int i=0;i<edge[id].size();i++)
        {
            int nxt=edge[id][i].to;
            if(!vis[nxt]&&dis[id]+edge[id][i].value<dis[nxt])
            {
                dis[nxt]=dis[id]+edge[id][i].value;
                node temp;
                temp.id=nxt;
                temp.w=dis[nxt];
                q.push(temp);
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值