我們可以將主鏈看做網路傳輸中傳送的資料報,節點在產生塊或收到鄰居發來的包(主鏈)並更新後,會向鄰居節點傳送自己的包,這裡假設傳送時刻為t,鏈路延遲為interval,當前時刻為cur,那麼鄰居節點只有在t+interval=cur時才能恰好收到這個包,我們當然可以構造乙個結構體
struct packet
;
來儲存這個包,其中link代表傳送的主鏈,t代表送達時刻(即傳送時刻+鏈路延遲interval),這樣就可以通過判斷t是否小於cur來確定這個包是否過期。
那麼有人可能會想,那我用乙個packet型別的陣列來儲存每個節點發出的資料報,下標就代表這個節點編號,可以嗎?答案是否定的!因為鏈路是有容量的,如果節點u在t時刻傳送乙個資料報後,又在t~t+interval的時間段內連續傳送了多個資料報,這樣所有的資料報都沒有送達(或者說都在路上),那麼我們用什麼來儲存這些資料報呢?可以用雙向佇列deque來儲存(至於為什麼是雙向的,到後面就會知道)。每傳送乙個資料報,就從佇列後端壓入乙個資料報,當資料報過期(t使用mp[cur]儲存cur時刻所有傳送方編號,因為每個節點每一秒都有可能收到資料報,因此我們需要寫乙個傳遞函式,來更新生成下一秒圖的狀態,遍歷當前時刻所有傳送方,根據提給條件和資料報更新鄰居的主鏈。
每次查詢(或生成塊)前我們需要把圖的狀態傳遞到查詢(或生成塊)的時刻,即一直傳遞到t==cur時,再進行查詢(或生成塊)的操作。
// 201912-4 區塊鏈.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。
//#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#include
#include
#include
#include
#define maxn 510
#define maxm 10010
using
namespace std;
int n, m, cnt;
//n個點,m條邊
int cur;
//當前時間
int interval;
struct packet
;struct edge
edge[maxm <<1]
;int head[maxn]
;vector<
int> node[maxn]
;//資料報佇列
deque que[maxn]
;//資料報時刻佇列
deque<
int> tque;
void
sendpacket
(int i,
int t)
//傳送節點i,傳送時刻t;if
(!que[i]
.empty()
&& que[i]
.back()
.t == p.t)
//清除過期資料報
que[i]
.pop_back()
; que[i]
.push_back
(p);
if(tque.
empty()
|| tque.
back()
!= p.t)
//更新資料報時刻佇列
tque.
push_back
(p.t);}
void
transmitonesec()
if(!que[u]
.empty()
&& que[u]
.front()
.t == cur)}}
if(flag)
sendpacket
(i, cur)
;//接收完鄰居的資料報後向外傳遞資料報}}
void
transmittocurrent
(int t)
}//a在t時刻產生了編號為c的塊
void
generate
(int a,
int t,
int c)
void
search
(int a,
int t)
cout << endl;
}void
init()
}void
addedge
(int u,
int v)
intmain()
cur =0;
cin >> interval >> k;
for(
int i =
0; i < k; i++
)else
}}
5 10
1 21 3
1 41 5
2 32 4
2 53 4
3 54 5
1 27
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
1 12 1
3 14 1
5 11 2
2 23 2
4 25 2
1 10 10
2 11 9
1 11
2 11
3 11
4 11
5 11
1 12
2 12
3 12
4 12
5 12
15 13
1 22 3
3 44 5
1 66 7
7 88 9
1 10
10 11
11 12
12 13
14 15
6 28
1 1 1
1 2 2
1 62 7
13 7
9 75 7
3 14
8 14
5 14
11 14
9 25
5 25
13 25
9 29 3
5 29 4
13 29 5
1 53
2 59 6
2 59
1 1000
3 1000
8 1000
9 1000
10 1000
13 1000
14 1000
15 1000
CCF 201912 4 區塊鏈(STL模擬)
好難寫的一道題,一開始寫是每次記錄下每個時間的被傳輸鏈和新增塊,然後每更新一次bfs全圖,但是寫不對。下面的 是參考 include include include include include include include include include using namespace std...
csp 201912 4區塊鏈 80分
思路直接利用優先佇列,將每一次會對外傳播的節點當前的狀態記住,同時也儲存這次傳播會到達的時間 每次產生和輸出之前先更新就可以,但是因為乙個節點可能在同一時間生成多個塊,會被卡時間,只能得到80分,後續優化懶得做了 附贈一組測試資料 15 13 1 22 3 3 44 5 1 66 7 7 88 9 ...
區塊鏈系列1 區塊鏈科普
區塊鏈本質上是乙個賬本,當乙個商品 乙個行為 乙個交易開始的時候,可以產生乙個區塊,它的整個流動的生命週期被詳細的記錄下來,形成乙個鏈。這個賬本會存在網際網路上,理論上無法被任何人拿走 篡改或者銷毀。優點 1.分布式,去中心化 拿位元幣來講,去中心化的好處就是不需要有乙個類似銀行的機構來為雙方交易提...