首页 > 代码库 > 边表+SPFA (使用指针+动态内存)

边表+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

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