首页 > 代码库 > 边表+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 (使用指针+动态内存)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。