Use Dijkstra and Floyd respectively .. The strange thing is that the time is 15 ms.
# Include <iostream> using namespace STD; # define n 12int n, m; int map [N] [N]; int sea [N]; int d [N]; int flag [N]; void Floyd () {for (INT I = 0; I <n; I ++) for (Int J = 0; j <N; j ++) for (int K = 0; k <n; k ++) {If (Map [J] [I] + map [I] [k] <map [J] [k]) map [J] [k] = map [J] [I] + map [I] [k] ;}} void Dijkstra () {for (INT CNT = 0; CNT <n-1; CNT ++) {int min = 0x7fffffff; int Index =-1; for (INT I = 0; I <n; I ++) {If (d [I] <min & & Flag [I] = 0) {Index = I; min = d [I] ;}} flag [Index] = 1; for (INT I = 0; I <n; I ++) {If (flag [I]) continue; For (Int J = 0; j <n; j ++) {If (flag [J] = 0) continue; If (d [J] + map [J] [I] <D [I]) d [I] = d [J] + map [J] [I] ;}}} int main () {freopen ("acm.txt", "r", stdin ); while (~ Scanf ("% d", & N) {memset (sea, 0, sizeof (SEA); memset (flag, 0, sizeof (FLAG )); // indicates that the initial set is empty. If it is selected, it is 1for (INT I = 0; I <n; I ++) for (Int J = 0; j <N; j ++) map [I] [J] = 0x1fffffff; For (INT I = 0; I <n; I ++) {int num; scanf ("% d", & num, & Sea [I]); For (Int J = 0; j <num; j ++) {int B, Len; scanf ("% d", & B, & Len); map [I] [B] = Len ;}} for (INT I = 0; I <N; I ++) d [I] = map [0] [I];/* Floyd (); int min = 0x7fffffff; For (INT I = 0; I <N; I ++) {If (SEA [I]) if (Map [0] [I] <min) min = map [0] [I];} cout <min <Endl; */Dijkstra (); int min = 0x7fffff; For (INT I = 0; I <n; I ++) {If (SEA [I]) if (d [I] <min) min = d [I] ;}cout <min <Endl ;}return 0 ;}