l2dct
http://paste.ubuntu.com/15664711/
diff -crbB ns-allinone-2.35/ns-2.35/queue/red.cc ns-2.35/queue/red.cc
*** ns-allinone-2.35/ns-2.35/queue/red.cc 2011-10-02 18:32:34.000000000 -0400
--- ns-2.35/queue/red.cc 2014-10-01 14:37:10.684908657 -0400
***************
*** 559,566 ****
edv_.count_bytes = 0;
hdr_flags* hf = hdr_flags::access(pickPacketForECN(pkt));
if (edp_.setbit && hf->ect() &&
! (!edp_.use_mark_p || edv_.v_prob1 < edp_.mark_p)) {
hf->ce() = 1; // mark Congestion Experienced bit
// Tell the queue monitor here - call emark(pkt)
return (0); // no drop
} else {
--- 559,567 ----
edv_.count_bytes = 0;
hdr_flags* hf = hdr_flags::access(pickPacketForECN(pkt));
if (edp_.setbit && hf->ect() &&
! (!edp_.use_mark_p || edv_.v_prob1 <= edp_.mark_p)) { // For DCTCP: '<' is changed to '<=' here
hf->ce() = 1; // mark Congestion Experienced bit
+ //fprintf(stdout,"DCTCP packet marked at time= %f\n", (double)Scheduler::instance().clock());
// Tell the queue monitor here - call emark(pkt)
return (0); // no drop
} else {
Only in ns-2.35/queue: red.cc~
diff -crbB ns-allinone-2.35/ns-2.35/tcl/lib/ns-default.tcl ns-2.35/tcl/lib/ns-default.tcl
*** ns-allinone-2.35/ns-2.35/tcl/lib/ns-default.tcl 2010-07-03 18:45:45.000000000 -0400
--- ns-2.35/tcl/lib/ns-default.tcl 2012-07-21 21:35:04.000000000 -0400
***************
*** 916,922 ****
Agent/TCP set exitFastRetrans_ true ; # Added 2003/7/28.
# For clean exits of Fast Retransmit.
# False for old buggy behavior.
! Agent/TCP set window_ 20
Agent/TCP set windowInit_ 2 ; # default changed on 2001/5/26.
Agent/TCP set windowInitOption_ 1
Agent/TCP set syn_ true ; # default changed on 2001/5/17.
--- 916,922 ----
Agent/TCP set exitFastRetrans_ true ; # Added 2003/7/28.
# For clean exits of Fast Retransmit.
# False for old buggy behavior.
! Agent/TCP set window_ 20000000
Agent/TCP set windowInit_ 2 ; # default changed on 2001/5/26.
Agent/TCP set windowInitOption_ 1
Agent/TCP set syn_ true ; # default changed on 2001/5/17.
***************
*** 1026,1031 ****
--- 1026,1039 ---- Agent/TCP set SetCWRonRetransmit_ true ; # added on 2005/06/19.
# default changed on 2008/06/05.
+ # DCTCP
+ Agent/TCP set dctcp_ false;
+ Agent/TCP set dctcp_alpha_ 0.0;
+ Agent/TCP set dctcp_g_ 0.0625;
+
+ # D2TCP
+ Agent/TCP set flow_deadline 100000;
+ Agent/TCP set flow_size 10000000000; # XXX Generate nam trace or plain old text trace for variables.
# When it's true, generate nam trace.
diff -crbB ns-allinone-2.35/ns-2.35/tcp/tcp.cc ns-2.35/tcp/tcp.cc
*** ns-allinone-2.35/ns-2.35/tcp/tcp.cc 2011-06-20 00:51:46.000000000 -0400
--- ns-2.35/tcp/tcp.cc 2014-10-01 14:55:29.020865582 -0400
***************
*** 47,52 ****
--- 47,56 ----
#include "basetrace.h"
#include "hdr_qs.h" + #define debug_dctcp 0
+ #define wmax 2.5 //Max weight a flow can get
+ #define wmin 0.125 //Min weight a flow can get
+
int hdr_tcp::offset_; static class TCPHeaderClass : public PacketHeaderClass {
***************
*** 76,82 ****
first_decrease_(1), fcnt_(0), nrexmit_(0), restart_bugfix_(1),
cong_action_(0), ecn_burst_(0), ecn_backoff_(0), ect_(0),
use_rtt_(0), qs_requested_(0), qs_approved_(0),
! qs_window_(0), qs_cwnd_(0), frto_(0)
{
#ifdef TCP_DELAY_BIND_ALL
// defined since Dec 1999.
--- 80,86 ----
first_decrease_(1), fcnt_(0), nrexmit_(0), restart_bugfix_(1),
cong_action_(0), ecn_burst_(0), ecn_backoff_(0), ect_(0),
use_rtt_(0), qs_requested_(0), qs_approved_(0),
! qs_window_(0), qs_cwnd_(0), frto_(0), dctcp_maxseq(0)
{
#ifdef TCP_DELAY_BIND_ALL
// defined since Dec 1999.
***************
*** 101,106 ****
--- 105,113 ----
bind("necnresponses_", &necnresponses_);
bind("ncwndcuts_", &ncwndcuts_);
bind("ncwndcuts1_", &ncwndcuts1_);
+ bind("dctcp_", &dctcp_);
+ bind("dctcp_alpha_", &dctcp_alpha_);
+ bind("dctcp_g_", &dctcp_g_);
#endif /* TCP_DELAY_BIND_ALL */ }
***************
*** 123,128 ****
--- 130,140 ----
delay_bind_init_one("overhead_");
delay_bind_init_one("tcpTick_");
delay_bind_init_one("ecn_");
+ // DCTCP
+ delay_bind_init_one("dctcp_");
+ delay_bind_init_one("dctcp_alpha_");
+ delay_bind_init_one("dctcp_g_");
+
delay_bind_init_one("SetCWRonRetransmit_");
delay_bind_init_one("old_ecn_");
delay_bind_init_one("bugfix_ss_");
***************
*** 234,239 ****
--- 246,255 ----
if (delay_bind(varName, localName, "overhead_", &overhead_, tracer)) return TCL_OK;
if (delay_bind(varName, localName, "tcpTick_", &tcp_tick_, tracer)) return TCL_OK;
if (delay_bind_bool(varName, localName, "ecn_", &ecn_, tracer)) return TCL_OK;
+ // Ali munir
+ if (delay_bind_bool(varName, localName, "dctcp_", &dctcp_, tracer)) return TCL_OK;
+ if (delay_bind(varName, localName, "dctcp_alpha_", &dctcp_alpha_ , tracer)) return TCL_OK;
+ if (delay_bind(varName, localName, "dctcp_g_", &dctcp_g_ , tracer)) return TCL_OK;
if (delay_bind_bool(varName, localName, "SetCWRonRetransmit_", &SetCWRonRetransmit_, tracer)) return TCL_OK;
if (delay_bind_bool(varName, localName, "old_ecn_", &old_ecn_ , tracer)) return TCL_OK;
if (delay_bind_bool(varName, localName, "bugfix_ss_", &bugfix_ss_ , tracer)) return TCL_OK;
***************
*** 719,724 ****
--- 735,743 ----
hf->ecnecho() = 1;
// hf->cong_action() = 1;
hf->ect() = 0;
+ /* ali munir */
+ if (dctcp_)
+ hf->ect() = 1;
}
if (qs_enabled_) {
hdr_qs *qsh = hdr_qs::access(p);
***************
*** 775,780 ****
--- 794,807 ----
send(p, 0);
if (seqno == curseq_ && seqno > maxseq_)
idle(); // Tell application I have sent everything so far
+
+ /* ali munir: begins*/
+ if (dctcp_)
+ if (seqno > dctcp_maxseq)
+ dctcp_maxseq = seqno;
+
+
+
if (seqno > maxseq_) {
maxseq_ = seqno;
if (!rtt_active_) {
***************
*** 1119,1124 ****
--- 1146,1175 ----
void TcpAgent::opencwnd()
{
double increment;
+ double weight_c; //Ali Munir
+ double mywnd_old; //Ali Munir
+ double mywnd_new; //Ali Munir
+
+ /* Ali Munir: Begin */
+ mywnd_old = cwnd_;
+
+ if (dctcp_) {
+
+ if (ndatapack_ <= 200) weight_c = wmax;
+ if (ndatapack_ > 200) weight_c = wmax - (wmax-wmin) * (ndatapack_ - 200) / 800;
+
+ if (weight_c < wmin) weight_c = wmin;
+ if (weight_c > wmax) weight_c = wmax;
+
+ increase_num_ = weight_c / wmax;
+
+ if(debug_dctcp)
+ printf("opencwnd: increase=%f\n", increase_num_);
+
+ }
+ /* Ali Munir: End */
+
+
if (cwnd_ < ssthresh_) {
/* slow-start (exponential) */
cwnd_ += 1;
***************
*** 1127,1136 ****
double f;
switch (wnd_option_) {
case 0:
! if (++count_ >= cwnd_) {
! count_ = 0;
! ++cwnd_;
! }
break; case 1:
--- 1178,1188 ----
double f;
switch (wnd_option_) {
case 0:
! // Begin
! increment = increase_num_ / cwnd_;
! cwnd_ += increment;
! if(debug_dctcp)
! printf("opencwnd: increase=%f, test print # 0\n", increase_num_);
break; case 1:
***************
*** 1143,1148 ****
--- 1195,1202 ----
max_ssthresh_, increment);
}
cwnd_ += increment;
+ if(debug_dctcp)
+ printf("opencwnd: increase=%f, test print # 1\n", increase_num_);
break; case 2:
***************
*** 1153,1158 ****
--- 1207,1214 ----
* with Multiple Congested Gateways".
* The window is increased by roughly
* wnd_const_*RTT^2 packets per round-trip time. */
+ if(debug_dctcp)
+ printf("opencwnd: increase=%f, test print # 2\n", increase_num_);
f = (t_srtt_ >> T_SRTT_BITS) * tcp_tick_;
f *= f;
f *= wnd_const_;
***************
*** 1178,1183 ****
--- 1234,1241 ----
++cwnd_;
} else
fcnt_ = f;
+ if(debug_dctcp)
+ printf("opencwnd: increase=%f, test print # 3\n", increase_num_);
break; case 4:
***************
*** 1192,1197 ****
--- 1250,1257 ----
++cwnd_;
} else
fcnt_ = f;
+ if(debug_dctcp)
+ printf("opencwnd: increase=%f, test print # 4\n", increase_num_);
break;
case 5:
/* The window is increased by roughly wnd_const_*RTT
***************
*** 1206,1215 ****
--- 1266,1279 ----
++cwnd_;
} else
fcnt_ = f;
+ if(debug_dctcp)
+ printf("opencwnd: increase=%f, test print # 5\n", increase_num_);
break;
case 6:
/* binomial controls */
cwnd_ += increase_num_ / (cwnd_*pow(cwnd_,k_parameter_));
+ if(debug_dctcp)
+ printf("opencwnd: increase=%f, test print # 6\n", increase_num_);
break;
case 8:
/* high-speed TCP, RFC 3649 */
***************
*** 1221,1232 ****
--- 1285,1300 ----
max_ssthresh_, increment);
}
cwnd_ += increment;
+ if(debug_dctcp)
+ printf("opencwnd: increase=%f, test print # 8\n", increase_num_);
break;
default:
#ifdef notdef
/*XXX*/
error("illegal window option %d", wnd_option_);
#endif
+ if(debug_dctcp)
+ printf("opencwnd: increase=%f, test print # default\n", increase_num_);
abort();
}
}
***************
*** 1234,1239 ****
--- 1302,1311 ----
if (maxcwnd_ && (int(cwnd_) > maxcwnd_))
cwnd_ = maxcwnd_; + if(debug_dctcp){
+ mywnd_new = cwnd_;
+ printf("opencwnd: increase=%f, cwnd: old %f new %f\n", increase_num_, (double)windowd(), mywnd_new);
+ }
return;
} ***************
*** 1243,1248 ****
--- 1315,1322 ----
double decrease; /* added for highspeed - sylvia */
double win, halfwin, decreasewin;
int slowstart = 0;
+ double b_;
+ double weight_c;
++ncwndcuts_;
if (!(how & TCP_IDLE) && !(how & NO_OUTSTANDING_DATA)){
++ncwndcuts1_;
***************
*** 1297,1302 ****
--- 1371,1381 ----
} else {
ssthresh_ = (int) decreasewin;
}
+ else if (how & CLOSE_SSTHRESH_DCTCP) {
+ ssthresh_ = (int) ((1 - dctcp_alpha_/2.0) * windowd());
+ if(debug_dctcp)
+ fprintf(stdout,"DCTCP backoff (ssthresh) applied (alpha=%f) at time= %f\n", (double)dctcp_alpha_, (double)Scheduler::instance().clock());
+ }
else if (how & THREE_QUARTER_SSTHRESH)
if (ssthresh_ < 3*cwnd_/4)
ssthresh_ = (int)(3*cwnd_/4);
***************
*** 1306,1311 ****
--- 1385,1407 ----
if (first_decrease_ == 1 || slowstart || decrease_num_ == 0.5) {
cwnd_ = halfwin;
} else cwnd_ = decreasewin;
+ else if (how & CLOSE_CWND_DCTCP){
+
+ /* Ali Munir: Begin */
+ if (ndatapack_ <= 200) weight_c = wmax;
+ if (ndatapack_ > 200) weight_c = wmax - (wmax-wmin) * (ndatapack_ - 200) / 800;
+
+
+ if (weight_c < wmin) weight_c = wmin;
+ if (weight_c > wmax) weight_c = wmax;
+
+ b_ = pow(dctcp_alpha_,weight_c);
+ cwnd_ = (1 - b_/2.0) * windowd();
+
+ if(debug_dctcp)
+ fprintf(stdout,"DCTCP backoff (cwnd down) applied (alpha=%f) at time= %f, weight=%f b=%f, cwnd %f, fid %d\n", (double)dctcp_alpha_, (double)Scheduler::instance().clock(), weight_c, b_, (double)windowd(), fid_);
+ /* Ali Munir: End */
+ }
else if (how & CWND_HALF_WITH_MIN) {
// We have not thought about how non-standard TCPs, with
// non-standard values of decrease_num_, should respond
***************
*** 1328,1334 ****
}
if (ssthresh_ < 2)
ssthresh_ = 2;
! if (how & (CLOSE_CWND_HALF|CLOSE_CWND_RESTART|CLOSE_CWND_INIT|CLOSE_CWND_ONE))
cong_action_ = TRUE; fcnt_ = count_ = 0;
--- 1424,1432 ----
}
if (ssthresh_ < 2)
ssthresh_ = 2;
! if (cwnd_ < 1)
! cwnd_ = 1;
! if (how & (CLOSE_CWND_HALF|CLOSE_CWND_RESTART|CLOSE_CWND_INIT|CLOSE_CWND_ONE|CLOSE_CWND_DCTCP))
cong_action_ = TRUE; fcnt_ = count_ = 0;
***************
*** 1429,1434 ****
--- 1527,1535 ----
rtt_backoff();
else ecn_backoff_ = 1;
} else ecn_backoff_ = 0;
+ if (dctcp_)
+ slowdown(CLOSE_CWND_DCTCP|CLOSE_SSTHRESH_DCTCP);
+ else
slowdown(CLOSE_CWND_HALF|CLOSE_SSTHRESH_HALF);
++necnresponses_ ;
// added by sylvia to count number of ecn responses
Only in ns-2.35/tcp: tcp.cc~
diff -crbB ns-allinone-2.35/ns-2.35/tcp/tcp.h ns-2.35/tcp/tcp.h
*** ns-allinone-2.35/ns-2.35/tcp/tcp.h 2011-08-26 15:29:57.000000000 -0400
--- ns-2.35/tcp/tcp.h 2012-07-11 06:07:18.000000000 -0400
***************
*** 104,110 ****
#define CWND_HALF_WITH_MIN 0x00000200
#define TCP_IDLE 0x00000400
#define NO_OUTSTANDING_DATA 0x00000800
!
/*
* tcp_tick_:
* default 0.1,
--- 104,111 ----
#define CWND_HALF_WITH_MIN 0x00000200
#define TCP_IDLE 0x00000400
#define NO_OUTSTANDING_DATA 0x00000800
! #define CLOSE_SSTHRESH_DCTCP 0x00001000
! #define CLOSE_CWND_DCTCP 0x00002000
/*
* tcp_tick_:
* default 0.1,
***************
*** 432,437 ****
--- 433,445 ---- /* Used for ECN */
int ecn_; /* Explicit Congestion Notification */
+
+ /* Use for DCTCP */
+ int dctcp_;
+ double dctcp_alpha_;
+ double dctcp_g_;
+ int dctcp_maxseq;
+
int cong_action_; /* Congestion Action. True to indicate
that the sender responded to congestion. */
int ecn_burst_; /* True when the previous ACK packet
diff -crbB ns-allinone-2.35/ns-2.35/tcp/tcp-sack1.cc ns-2.35/tcp/tcp-sack1.cc
*** ns-allinone-2.35/ns-2.35/tcp/tcp-sack1.cc 2006-12-24 12:04:44.000000000 -0500
--- ns-2.35/tcp/tcp-sack1.cc 2014-10-01 15:10:19.248830658 -0400
***************
*** 38,43 ****
--- 38,45 ----
#define RECOVER_TIMEOUT 2
#define RECOVER_QUENCH 3 + #define debug_dctcp 0
+
class Sack1TcpAgent : public TcpAgent {
public:
Sack1TcpAgent();
***************
*** 53,58 ****
--- 55,67 ----
protected:
u_char timeout_; /* boolean: sent pkt from timeout? */
u_char fastrecov_; /* boolean: doing fast recovery? */
+ /* variables for DCTCP */
+ int dctcp_total;
+ int dctcp_marked;
+ int dctcp_alpha_update_seq;
+ // int dctcp_maxseq;
+ int ce_transition;
+
int pipe_; /* estimate of pipe size (fast recovery) */
int partial_ack_; /* Set to "true" to ensure sending */
/* a packet on a partial ACK. */
***************
*** 61,66 ****
--- 70,76 ----
int firstpartial_; /* First of a series of partial acks. */
ScoreBoard* scb_;
static const int SBSIZE=64; /* Initial scoreboard size */
+ void update_dctcp_alpha(Packet *); /* DCTCP alpha update */
}; static class Sack1TcpClass : public TclClass {
***************
*** 71,77 ****
}
} class_sack; ! Sack1TcpAgent::Sack1TcpAgent() : fastrecov_(FALSE), pipe_(-1), next_pkt_(0), firstpartial_(0)
{
bind_bool("partial_ack_", &partial_ack_);
/* Use the Reassembly Queue based scoreboard as
--- 81,88 ----
}
} class_sack; ! Sack1TcpAgent::Sack1TcpAgent() : fastrecov_(FALSE), pipe_(-1), next_pkt_(0), firstpartial_(0),
! dctcp_total(0), dctcp_marked(0), dctcp_alpha_update_seq(0), ce_transition(0)
{
bind_bool("partial_ack_", &partial_ack_);
/* Use the Reassembly Queue based scoreboard as
***************
*** 116,121 ****
--- 127,139 ----
return;
}
++nackpack_;
+
+ /* ali munir */
+ if (dctcp_)
+ update_dctcp_alpha(pkt);
+
+
+
int ecnecho = hdr_flags::access(pkt)->ecnecho();
if (ecnecho && ecn_)
ecn(tcph->seqno());
***************
*** 284,289 ****
--- 304,315 ---- if (ecn_ && last_cwnd_action_ == CWND_ACTION_ECN) {
last_cwnd_action_ = CWND_ACTION_DUPACK;
+
+ /* ali munir: cut window by half when we have 3 dup ack */
+ if (dctcp_)
+ slowdown(CLOSE_SSTHRESH_HALF|CLOSE_CWND_HALF);
+
+
/*
* What if there is a DUPACK action followed closely by ECN
* followed closely by a DUPACK action?
***************
*** 400,405 ****
--- 426,438 ----
* If DSACK and detection of premature retransmit
* timeouts, then save some info here.
*/
+ /* begin: ali munir */
+ //dctcp_alpha_update_seq = tno; /* should be t_seqno_ */
+ dctcp_alpha_update_seq = t_seqno_;
+ dctcp_maxseq = dctcp_alpha_update_seq;
+
+ /* end: ali munir */
+
dupacks_ = 0;
fastrecov_ = FALSE;
timeout_ = TRUE;
***************
*** 419,424 ****
--- 453,507 ----
frto_ = 0;
} +
+ /*
+ * Update dctcp alpha based on the ecn bit in the received packet.
+ * This procedure is called only when dctcp_ is 1.
+ */
+ void Sack1TcpAgent::update_dctcp_alpha(Packet *pkt)
+ {
+ int ecnbit = hdr_flags::access(pkt)->ecnecho();
+ int ackno = hdr_tcp::access(pkt)->ackno();
+ int seqno = hdr_tcp::access(pkt)->seqno();
+ int acked_bytes = seqno - highest_ack_;
+
+ if(debug_dctcp)
+ printf ("timeout. highest_ack: %i seqno: %i fid: %i seqnum: %i\n",
+ (int)highest_ack_, (int)t_seqno_, fid_, seqno);
+
+ if (acked_bytes <= 0)
+ // acked_bytes = size_; /* it should be one */
+ acked_bytes = 1; /* it should be one */
+ dctcp_total += acked_bytes;
+ if (ecnbit) {
+ dctcp_marked += acked_bytes;
+ }
+
+ if(debug_dctcp)
+ fprintf(stdout,"DCTCP update_alpha 1: (ackno=%i), (dctcp_alpha_update=%f), (dctcp_maxseq=%f), (acked_bytes=%d)\n", (int)ackno, (double)dctcp_alpha_update_seq, (double)dctcp_maxseq, acked_bytes);
+ /* Check for barrier indicating its time to recalculate alpha.
+ * This code basically updated alpha roughly once per RTT.
+ */
+ if (seqno > dctcp_alpha_update_seq) {
+ double temp_alpha;
+ dctcp_alpha_update_seq = dctcp_maxseq;
+ if (dctcp_total > 0)
+ temp_alpha = ((double) dctcp_marked) / dctcp_total;
+ else
+ temp_alpha = 0.0;
+
+ // temp_alpha = ((double) dctcp_marked) / 35.0;
+ dctcp_alpha_ = (1 - dctcp_g_) * dctcp_alpha_ + dctcp_g_ * temp_alpha;
+ dctcp_marked = 0;
+ dctcp_total = 0;
+ }
+
+ if(debug_dctcp)
+ fprintf(stdout,"DCTCP update_alpha: (dctcpseq=%d), (marked=%d), (total=%d), (alpha=%f) at time= %f\n", dctcp_maxseq, dctcp_marked, dctcp_total, (double)dctcp_alpha_, (double)Scheduler::instance().clock());
+ }
+
+
+
void Sack1TcpAgent::send_much(int force, int reason, int maxburst)
{
register int found, npacket = 0;
Only in ns-2.35/tcp: tcp-sack1.cc~
l2dct的更多相关文章
随机推荐
- Phoenix 4.8
From v4.8.0 onwards, user can enable to map it’s schema to the namespace so that any table created w ...
- Spanner:谷歌新一代全球部署的列式数据库
Spanner 是一个可扩展的.全球分布式的数据库,提供分布式ACID. 架构 universe:一个部署的实例成为universe,目前谷歌有3个,分别为开发/测试/线上 Zone:一个数据中心,相 ...
- Nodejs学习笔记(十七)—浮点运算decimal.js
前言 开发过程中免不了有浮点运算,JavaScript浮点运算的精度问题会带来一些困扰 JavaScript 只有一种数字类型 ( Number ) JavaScript采用 IEEE 754 标准双 ...
- nginx 学习笔记(4) Connection处理方法
nginx支持connection的多种处理方法.nginx运行的平台确定了可用的处理方法. 在特定平台下connection的多种处理方法中,nginx会自动选择一种最有效的方法.然而,如果需要,你 ...
- JavaScript预编译详解
一.js运行三部曲: 1.语法分析(通篇扫描看有没有语法错误) 2.预编译 3.解释执行 二.预编译前奏 1.imply global 暗示全局变量:任何变量如果未经声明就赋值,此变量为全局对象所有 ...
- Linux系统资源查看 之 资源信息
1. 系统 版本信息 内核版本 使用 uname 命令: -a : 查看所有系统信息 -r : 查看内核版本信息 -s : 查看内核名称 代码如下: [niesh@niesh ~]$ uname -a ...
- Spring Framework’s WebDataBinder
Last week, I was just outside our nation’s capital teaching Spring Web MVC Framework to a wonderful ...
- C#比较两个字符串的相似度【转】
原文地址:http://www.2cto.com/kf/201202/121170.html 我们在做数据系统的时候,经常会用到模糊搜索,但是,数据库提供的模糊搜索并不具备按照相关度进行排序的功能. ...
- JavaScript unshift()函数移入数据到数组第一位
你不仅可以 shift(移出)数组中的第一个元素,你也可以 unshift(移入)一个元素到数组的头部. .unshift() 函数用起来就像 .push() 函数一样, 但不是在数组的末尾添加元素, ...
- 【模板 && 拓扑】 Dijkstra 单源最短路径算法
话不多说上代码 链式前向星233 #include<bits/stdc++.h> using namespace std; ,_max=0x3fffffff; //链式前向星 struct ...