這道題也可以用佇列來做,但比較麻煩。。。。沒辦法,蒟蒻一枚。
首先,將起點(ci==1的點)放入佇列之中。當head< tail時,
++head,將隊首的點(team【head】)展開去找他的兒子節點。
如果兒子節點沒放入佇列則放入。l代表本層最後乙個點在team【】中的序號,l2用於記錄修改前的l,便於輸出。當head==l時,則這一層的節點掃瞄畢。此時l+1到tail間的節點即是下一層的節點。對下一層的節點施行減ui【】操作,如果減完後的ci【】大於0,則這個節點處於興奮狀態,可以向下傳遞。若不能,則用ex【】(因為exst【】已經用來記錄別的了。。。)打個標記阻止繼續下傳。迴圈完成後,l2+1到l(也就是tail)之間的便是解(注意只用輸出大於0的,所以輸出時加乙個判定),至於co【】,只是為了按順序輸出用的。
解釋寫得夠詳細得了吧。。。
**如下:
#include
#include
#include
#include
#include
#include
using
namespace
std;
int n,p,ta,ci[1000001],ui[1000001];
int head,l2,tail,team[1000001],exist[100010];
int ex[1000001],co[1000001],lx;
struct
ace[100001*4];
void
build
(int x,int y,int z)
//建圖。
bool
cmp(int a,int b)
for(int i=1;i<=p;++i)
for(int i=1;i<=n;++i)
}//起點入隊。 int l=tail;//此時l為第一層最後乙個節點在team【】中的序號。
while(headif(head==l)//當某一層迴圈完畢時,執行減ui【】操作。
}l2=l;
l=tail;//更新l,l2.
}head++; int u=team[head];
if(ex[u]!=1)//如果節點興奮,則修改他的子節點。}}
}for(int i=l2+1;i<=tail;++i)
sort(co+1,co+1+lx,cmp);//從下到大輸出。
if((ci[co[lx]]==0&&ci[co[1]]==0)||tailcout
<<"null";//如果首尾都是0(因為sort過了,所以如果首尾都是0則全是0)或未遍歷到輸出層,則輸出null。
}else
}return
0;}
luogu1038神經網路
題目背景 人工神經網路 artificial neural network 是一種新興的具有自我學習能力的計算系統,在模式識別 函式逼近及貸款風險評估等諸多領域有廣泛的應用。對神經網路的研究一直是當今的熱門方向,蘭蘭同學在自學了一本神經網路的入門書籍後,提出了乙個簡化模型,他希望你能幫助他用程式檢驗...
洛谷1038 神經網路
原題位址 語死早 語體教系列 捋了好幾遍都沒看懂題幹在說啥,試著寫了寫,一提交果然有bug 最後還是看著題解改了個bug才過,倍受打擊 廣搜 解題思路 簡單的廣搜,用鄰接表存圖,入度為0的 或者c i 0的 點是輸入層,先放到佇列裡,c i 0的不是輸入層,要預處理一下,把c i 換成c i u i...
luogu1038 神經網路
人工神經網路 artificial neural network 是一種新興的具有自我學習能力的計算系統,在模式識別 函式逼近及貸款風險評估等諸多領域有廣泛的應用。對神經網路的研究一直是當今的熱門方向,蘭蘭同學在自學了一本神經網路的入門書籍後,提出了乙個簡化模型,他希望你能幫助他用程式檢驗這個神經網...