題意:多條地鐵線路,從起點到終點的最短路。
題解:使用分層圖最短路。
很容易想到建 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...