边表+SPFA (使用指针+动态内存)
只是我怕忘了怎么写指针操作 所以写一遍指针版的
然而洛谷评测机不给力,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 (使用指针+动态内存)的更多相关文章
- C和指针--动态内存分配
1.为什么需要使用动态内存分配 数组的元素存储于内存中连续的位置上,当一个数组被声明时,它所需要的内存在编译时就被分配.当你声明数组时,必须用一个编译时常量指定数组的长度.但是,数组的长度常常在运行时 ...
- C++指针和动态内存分配
指针和动态内存分配 数组与指针 数组 数组名是一个指针常量. 数组名传递数据时,传递的是地址. 数组作为函数参数时不指定第一维大小. 对象数组 A a[2] = {A(1,2)}; 执行时先调用有参数 ...
- C和指针 第十一章 动态内存分配
声明数组时,必须指定数组长度,才可以编译,但是如果需要在运行时,指定数组的长度的话,那么就需要动态的分配内存. C函数库stdlib.h提供了两个函数,malloc和free,分别用于执行动态内存分配 ...
- 【C++】动态内存与智能指针
C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内 ...
- C++ Primer : 第十二章 : 动态内存之shared_ptr与new的结合使用、智能指针异常
shared_ptr和new结合使用 一个shared_ptr默认初始化为一个空指针.我们也可以使用new返回的指针来初始化一个shared_ptr: shared_ptr<double> ...
- 《C和指针》 读书笔记 -- 第11章 动态内存分配
1.C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放,这些函数维护一个可用内存池. void *malloc(size_t size);//返回指向分配的内存块起始位置的 ...
- C动态内存分配(C与指针实例)
主要初步介绍malloc.free.calloc.realloc的基本.日后会有更详细的内容. malloc.free分别用于动态内存分配和释放. malloc会从内存池里提取一块合适的内存(连续的) ...
- C++学习笔记(十一):void*指针、类型转换和动态内存分配
void*指针 void关键字表示“空类型”的概念.但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西. void ...
- 数据结构基础——指针及动态内存分配(malloc)
一.指针 C语言中的指针是一种数据类型,比如说我们用int *a;就定义了一个指针a,它指向一个int类型的数.但是这个指针是未初始化的,所以,一般的,我们都在创建指针时初始化它,以免出错,在还不吃的 ...
随机推荐
- Mybatis知识点总结
---恢复内容开始--- Mybatis知识点总结 1.#{}和${}的区别是什么? 答:#{}的使用场景:在表的sql映射文件中如下使用: <mapper namespace="co ...
- 在命令行中通过adb shell am broadcast发送广播通知
通过命令行执行adb shell am broadcast发送广播通知. adb shell am broadcast 后面的参数有:[-a <ACTION>][-d <DATA_U ...
- (C#) Interview Questions.
(Note: Most are collected from Internet. 绝大部分内容来自互联网) 1. What's the difference between Hashtable and ...
- codeforces 659 G. Fence Divercity 组合数学 dp
http://codeforces.com/problemset/problem/659/G 思路: f(i,0/1,0/1) 表示到了第i个,要被切的块开始了没有,结束了没有的状态的方案数 递推看代 ...
- 教你如何在word中像LaTex那样打出漂亮的数学公式
转载自: http://blog.csdn.net/ibingow/article/details/8613556 记得很久以前在word里打数学公式很痛苦,要用鼠标点啊点,效率奇低,包括像MathT ...
- MYSQL C API : struct MYSQL_STMT 结构的组合使用
#include <iostream> #include <string> #include <string.h> #include <assert.h> ...
- Java中的代理模式
代理模式在Java Web的框架中经常使用到.比如说在对数据库的访问中,核心功能是对数据库的增删改查,而连接数据库.处理事务等功能我们在开发中也要考虑到.所以我们将数据库的CRUD抽象到接口中,然后实 ...
- jquery是如何架构的.
心里一直有个疑问. jquery是如何做到一个jQuery即可以当方法用比如$();又可以当对象用$.extend(); 现在总结一下吧 function method(){} var m=new m ...
- 【knowledgebase】不要在一个很大的RDD上调用collect
如果一个RDD很大以至于它的所有元素并不能在driver端机器的内存中存放下,请不要进行如下调用: val values = myVeryLargeRDD.collect() collect将尝试 ...
- Statement及PreparedStatement执行多个sql
这两个对象的区别: 1.Statement它更适合执行不同sql的批处理,它没有提供预处理功能,性能比较低. 2.PreparedStatement它适合执行相同的批处理,它提供了预处理功能, ...