神經網路 拓撲排序

2022-02-13 07:23:31 字數 3204 閱讀 8116

原題:

神經網路

時間限制: 1 sec  記憶體限制: 256 mb

人工神經網路(artificial neural network)是一種新興的具有自我學習能力的計算系統,在模式識別、函式逼近及貸款風險評估等諸多領域有廣泛的應用。對神經網路的研究一直是當今的熱門方向,蘭蘭同學在自學了一本神經網路的入門書籍後,提出了乙個簡化模型,他希望你能幫助他用程式檢驗這個神經網路模型的實用性。

在蘭蘭的模型中,神經網路就是一張有向圖,圖中的節點稱為神經元,而且兩個神經元之間至多有一條邊相連,下圖是乙個神經元的例子:

圖中,x1​−x3​是資訊輸入渠道,y1​−y2​是資訊輸出渠道,c1​表示神經元目前的狀態,ui​是閾值,可視為神經元的乙個內在引數。

神經元按一定的順序排列,構成整個神經網路。在蘭蘭的模型之中,神經網路中的神經元分為幾層;稱為輸入層、輸出層,和若干個中間層。每層神經元只向下一層的神經元輸出資訊,只從上一層神經元接受資訊。下圖是乙個簡單的三層神經網路的例子。

蘭蘭規定,ci​服從公式:(其中n是網路中所有神經元的數目)

公式中的wji​(可能為負值)表示連線j號神經元和i號神經元的邊的權值。當ci​大於0時,該神經元處於興奮狀態,否則就處於平靜狀態。當神經元處於興奮狀態時,下一秒它會向其他神經元傳送訊號,訊號的強度為ci​。

如此.在輸入層神經元被激發之後,整個網路系統就在資訊傳輸的推動下進行運作。現在,給定乙個神經網路,及當前輸入層神經元的狀態(ci​),要求你的程式運算出最後網路輸出層的狀態。

輸入檔案第一行是兩個整數n(1≤n≤200)和p。接下來n行,每行兩個整數,第i+1行是神經元i最初狀態和其閾值(ui),非輸入層的神經元開始時狀態必然為0。再下面p行,每行由兩個整數i,j及乙個整數wij,表示連線神經元i、j的邊權值為wij。

輸出檔案包含若干行,每行有兩個整數,分別對應乙個神經元的編號,及其最後的狀態,兩個整數間以空格分隔。僅輸出最後狀態非零的輸出層神經元狀態,並且按照編號由小到大順序輸出!

若輸出層的神經元最後狀態均為 0,則輸出 null。

輸入輸出樣例

輸入

5 6

1 01 0

0 10 1

0 11 3 1

1 4 1

1 5 1

2 3 1

2 4 1

2 5 1

輸出

3 1

4 15 1

題面有點複雜,剛看的時候我也被繞進去了 ( ╯-_-)╯┴—┴(面無表情地掀桌)。

摁住桌板仔細看一遍,我們就會明白出題老師是如何把簡單東西弄成一堆我們看不懂的東西的。。。

好了回到正題——

題意:有一張不自環的有向圖,每個點都有乙個值(閾值)和初始狀態,從初始狀態為1的點開始遍歷,按題中所述計算每個點的值,求最後狀態由0變為1的點的編號。

顯而易見的,這是一道拓撲排序的模板題。

那麼,什麼是拓撲排序?

拓撲排序不是像氣泡排序、插入排序、歸併排序......它並不是對一組資料進行大小比較,而是指一張有向圖的遍歷方法(不帶環)

舉乙個簡單的例子

這張圖中,我們首先找乙個起始點,使它不被任何邊指向,稱之「入度為零」。

然後找到它指向的點,圖中為4號與5號。

現在,1號已經沒有用了,所以把1號取出。接下來可以發現2號和4號的入度也變成了零,所以把它們也取出,遍歷它們指向的點。

剩下的3號,5號,6號都沒有被別的邊指向,所以都可以取出。

好了,圖就這麼輕鬆的遍歷完了。

拓撲排序的順序可以有很多種,比如上面的圖可以是1→2→4→5→3→6,也可以是1→2→4→3→6→5,也可以是......

題中滿足無環、有向,所以是非常明顯的拓撲排序題。

我覺得已經講得非常詳細了,那麼(敲黑板劃重點)——

如何實現?

在之前的講述中,我們注意到有乙個非常重要的名詞——入度。

我們自然而然的想到了敲**的方法——讀入邊的時候,記錄一次入度,記錄一次出度("rd"即"入度","cd"即"出度")

void add(int a,int b,int

c)

for(int i=1; i<=m; i++)

這裡的add函式使用到了鄰接表的做法,不明白的同學看這裡(angel_kitty大佬

while(le}}

乾脆爽口的**(點選左上角複製):

1 #include2

using

namespace

std;

3const

int m=205;4

intn,m,cc[m],u[m];

5int

rd[m],cd[m];

6int

q[m],le,ri;

7int tot,head[m],next[m*m],vet[m*m],len[m*m];

8void add(int a,int b,int

c)12

intmain()

18for(int i=1; i<=m; i++)

24while(le

35}36int cnt=0;37

for(int i=1; i<=n; i++)41}

42if(cnt==0) printf("

null\n");

43return0;

44 }

3076 神經網路 bfs和拓撲排序

時間限制 1 sec 記憶體限制 125 mb 提交 7 解決 5 提交 狀態 討論版 命題人 外部匯入 edit testdata 同步資料 人工神經網路 artificial neural network 是一種新興的具有自我學習能力的計算系統,在模式識別 函式逼近及貸款風險評估等諸多領域有廣泛...

P1038 神經網路 拓撲排序

題目背景 人工神經網路 artificial neural networkartificialneuralnetwork 是一種新興的具有自我學習能力的計算系統,在模式識別 函式逼近及貸款風險評估等諸多領域有廣泛的應用。對神經網路的研究一直是當今的熱門方向,蘭蘭同學在自學了一本神經網路的入門書籍後,...

P1038 神經網路 拓撲排序

傳送門 思路 一道拓撲排序經典題,此題要求算出最後所有的結點c i c i c i 一開始c i 0c i 0 c i 0的點被認為是輸入層,即入度為0的點。然後用拓撲排序對相鄰結點不斷操作即可,輸出層即出度為0的點。最後從1 11到n nn遍歷判斷該結點是否滿足 ou t i c i 0 out ...