dijkstra25分求助
查看原帖
dijkstra25分求助
220676
Coral_Swallow楼主2021/2/11 11:32

打了个堆优化的dijkstra,结果惨兮兮的爆掉了

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N=205;
const int inf=1234567890;
struct edge
{
    int to,next,val;
}e[N*N];
struct node
{
    int pos;
    int dis;
    friend bool operator <(node a,node b)
    {
        return a.dis<b.dis;
    }
};
priority_queue<node> q;
int n;
int w,dis[N];
bool vis[N];
int head[N],cnt=0;
void add_edge(int u,int v,int w)
{
    e[++cnt].to=v;
    e[cnt].val=w;
    e[cnt].next=head[u];
    head[u]=cnt;
}
void init()
{
    for(int i=1;i<=n;i++)
        dis[i]=inf;
    dis[1]=0;
}
int main()
{
    scanf("%d",&n);
    init();
    memset(head,-1,sizeof(head));
    memset(vis,0,sizeof(vis));
    for(int i=1;i<n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            scanf("%d",&w);
            add_edge(i,j,w);
        }
    }
    q.push((node){1,0});
    while(!q.empty())
    {
        node tmp=q.top();
        q.pop();
        int p=tmp.pos;
        int d=tmp.dis;
        if(vis[p])continue;
        vis[p]=1;
        for(int k=head[p];k!=-1;k=e[k].next)
        {
            int t=e[k].to;
            if(dis[t]>dis[p]+e[k].val)
            {
                dis[t]=dis[p]+e[k].val;
                if(!vis[t])
                {
                    q.push((node){t,dis[t]});
                }
            }
        }
    }
    printf("%d\n",dis[n]);
    return 0;
}
2021/2/11 11:32
加载中...