只是我怕忘了怎么写指针操作 所以写一遍指针版的
然而洛谷评测机不给力,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