小 x 正困在乙個密室裡,他希望盡快逃出密室。
密室中有 n個房間,初始時,小 x 在 1號房間,而出口在 n號房間。
密室的每乙個房間中可能有著一些鑰匙和一些傳送門,乙個傳送門會單向地創造一條從房間 x到房間 y的通道。另外,想要通過某個傳送門,就必須具備一些種類的鑰匙(每種鑰匙都要有才能通過)。幸運的是,鑰匙在開啟傳送門的封印後,並不會消失。
然而,通過密室的傳送門需要耗費大量的時間,因此,小 x 希望通過盡可能少的傳送門到達出口,你能告訴小 x 這個數值嗎?
另外,小 x 有可能不能逃出這個密室,如果是這樣,請輸出"no solution"
。
第一行三個整數 n,m,k,分別表示房間的數量、傳送門的數量以及鑰匙的種類數。
接下來 n行,每行 k個 0或 1,若第 i 個數為 1,則表示該房間內有第 i種鑰匙,若第 i個數為 0,則表示該房間內沒有第 i種鑰匙。
接下來 m行,每行先讀入兩個整數 x,y,表示該傳送門是建立在 x號房間,通向 y號房間的,再讀入 k個 0或 1,若第 i個數為 1,則表示通過該傳送門需要 i種鑰匙,若第 i個數為 0,則表示通過該傳送門不需要第 iii 種鑰匙。
輸出一行乙個"no solution"
,或乙個整數,表示最少通過的傳送門數。
樣例輸入1
3 3 2樣例輸出11 00 1
0 01 3 1 1
1 2 1 0
2 3 1 1
2樣例輸入2
20 40 0樣例輸出210 18
18 14
19 13
4 14
13 10
5 18
14 1
13 13
10 16
19 11
11 15
10 18
5 8
12 19
7 8
18 6
14 5
9 5
2 17
13 14
18 15
8 18
7 1
13 5
4 6
17 4
1 4
10 10
13 8
19 2
4 9
3 3
5 10
17 5
12 8
19 11
3 16
17 10
18 16
13 13
no solution樣例輸入3
20 50 0樣例輸出38 10
7 17
5 11
14 20
20 16
8 19
12 11
18 7
17 5
4 15
16 11
11 8
10 12
8 9
16 8
3 16
1 6
3 20
6 10
11 12
6 8
18 17
14 17
3 11
4 19
9 2
8 6
13 2
5 2
12 19
8 10
14 7
6 12
6 4
13 2
8 7
13 19
17 9
3 14
18 20
2 14
4 17
20 15
14 15
2 15
7 20
12 12
18 10
15 9
15 9
4裸的搜尋
把鑰匙的狀態壓縮為二進位制數x<1024
判斷能否傳送?
邊權為需要鑰匙的狀態
dis&x==dis那麼就可以傳送
1 #include2 #include3 #include4 #include5 #include6using
namespace
std;
7struct
node
8edge[50001
];11
struct
zt12;15
int num,head[5001
];16
int dist[5001][1501],key[5001
],n,k,m;
17bool vis[5001][1501
];18
void add(int u,int v,int
dis)
1926
void
spfa()
27 );
31 dist[1][key[1]]=0;32
while (q.empty()==0)33
48if (vis[v][u.t|key[v]]==0)49
);52}53
}54}55
}56 cout<
no solution";
57return;58
}59intmain()
60 68}69
for (i=1;i<=m;i++)
7077
add(l,r,dis);
78}
79spfa();
80 }
計蒜客NOIP模擬賽 2 D2T2紫色百合
問題描述 牽著你的手的是她,路邊開滿了紫色的百合花 你從夢中醒來,卻依然忘不了夢中的 她百合花,每朵百合花都有乙個權值,在二進位制下寫成一行 1 第 i朵紫色百合的權值在二進位制下寫成i個 1 你想挑出其中一些組成 一束百合花 且價值在二進位制下恰好為乙個 1 後面p個 0 那麼有多少種挑選方案呢?...
計蒜客模擬賽5 D2T2 螞蟻搬家
很久很久以前,有很多螞蟻部落共同生活在一片祥和的村莊裡。但在某一天,村莊裡突然出現了乙隻食蟻獸,螞蟻們為了保全性命而決定搬家。然而這個村莊四面環山,想要離開這個村莊必須要從地洞裡離開,村子裡一共有 2n2n2n 個地洞,分布在山的左右,一邊 nnn 個。左邊的任意乙個地洞都可以通到右邊 nnn 個地...
計蒜客NOIP2018模擬1
t1 最失敗的一道題,其實就是道水題,好幾種寫法,一種都沒想出來。題意轉化後就是 每個數可以選a i 和a i k,最後求使1,2,3,t都存在的最大的t 1和最多能讓多少個數小於等於t。為什麼第一問可以轉化成求有多少個數小於等於t呢?首先不大於k的怪物可以直接殺死,然後大於k的怪物顯然當且僅當血量...