牛客網 小白月賽16 J題 小雨坐地鐵

2021-09-25 13:25:07 字數 1207 閱讀 1429

題意:多條地鐵線路,從起點到終點的最短路。

題解:使用分層圖最短路。

很容易想到建 m 層圖,如果多條地鐵線都經過同乙個點,則在這些點之間暴力兩兩連邊,這樣連邊是 o(nm2),

我們可以多建一層虛點,所有點到它對應的虛點不需要代價,從虛點到它對應的點需要對應的代價,這樣就可以優化到 o(nm) 建圖。最後跑一邊最短路就好了。

/*

時間複雜度:o(mlogn)點的數量

*/#includeusing namespace std;

const int maxn = 6e5 + 10; //最大值為結點的個數

#define inf 2147483647

typedef long long int ll;

vectorg[maxn]; //當點的數量過大時,這裡有可能會記憶體溢位,開全域性變數就行

struct dijkstra //封裝的dijkstra模板

}; ll n, m, k; //n個點,m個邊

vectoredges;

bool done[maxn]; //是否已永久標號

ll d[maxn]; //s到各個點的距離

ll p[maxn]; //最短路中的上一條弧

void init(ll n) //初始化邊和點

void addedge(ll from, ll to, ll dist) //新增邊

struct heapnode //尋找未使用的最小d[i],把的d[i]和i繫結到一起

};void dijkstra(int s)

); while (!q.empty()));}

}} }

};int main()

djk.addedge(i*n + k, n*(m + 1) + k, 0); //與建立的虛點相連

djk.addedge(n*(m + 1) + k, i*n + k, a);

lat = k;

} }djk.dijkstra(n*(m + 1) + s); //最短路

if (djk.d[n*(m + 1) + t] == inf)

cout << -1 << endl;

else

cout << djk.d[n*(m + 1) + t] << endl;

return 0;

}

牛客小白月賽16 小雨的矩陣 (暴力搜尋)

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 小雨有乙個 n nn times nn n 的矩陣,起點在 1,1 終點在 n,n 只能向下或向右走,且每次只能走 1 步。矩陣上每個點都有乙個點權 ai,ja a...

牛客小白月賽16

很容易得到n 1時,因為小石先手,所以小石一定輸 而n!1時,假設n 5 小石先取1 小陽取2 4 小石去3 小陽輸,無論怎樣小石都有贏的機會 includeusing namespace std int main 打表求出1 1e3之間的所有三角形每層之和 include define ll lo...

牛客網 小白月賽 D題

位運算是乙個非常重要的東西。而小a最近在學習位運算,小a看到了一道很簡單的例題,是說從n個數裡面選出n 1個數要讓它們或起來的值最大,小a想知道這個答案是多少。你可以幫幫他嗎?輸入描述 第一行乙個整數n表示有n個數接下來一行n個數表示a1,a2 an第一行乙個整數n表示有n個數接下來一行n個數表示a...