边表+SPFA (使用指针+动态内存)

233

只是我怕忘了怎么写指针操作 所以写一遍指针版的

然而洛谷评测机不给力,400多ms过了数组的,600多ms过指针的。。。

我想,指针的比数组的理解起来应该容易一点吧

戳我是数组版的,NOIP时候还是用数组为好,万一出现了点bug不就爆零了啊

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
struct edge
{
    int v,w;
    edge*next;
};
edge*link[10001];
int d[10001],n,m,s,X,Y,Z;
bool v[10001];
queue<int>q;
void add(int u,int v,int w)
{
    edge*p=new edge;
    p->v=v;
    p->w=w;
    p->next=link[u];
    link[u]=p;
}
void digui(edge*p)
{
	if(p==NULL)return;
	
	if(p->next!=NULL)
		digui(p->next);
	delete p;
	p=NULL;
}
void remove()
{
	for(int i=1;i<=n;i++)
		digui(link[i]);
}
int main()
{
    cin >> n >> m >> s;//分别为顶点数 有向边数 源点
    for(int i=1;i<=m;i++)
    {
        cin >> X >> Y >> Z;//是有向边 x->y 长度z
        add(X,Y,Z);
    }
    q.push(s);
    v[s]=true;
    for(int i=1;i<=n;i++)
    	d[i]=2147483647;
    d[s]=0;
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        v[x]=false;
        for(edge*i=link[x];i!=0;i=i->next)
        {
            if(d[x]+i->w<d[i->v])
            {
                d[i->v]=d[x]+i->w;
                if(v[i->v]==false)
                {
                    v[i->v]=true;
                    q.push(i->v);
                }
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        cout << d[i] << ' ';
    }
    remove();
    return 0;
}

233

233

原文地址:https://www.cnblogs.com/oier/p/5931897.html