AcWing 178 第K短路(第二次重新來過)

2021-10-04 02:36:30 字數 2456 閱讀 6526

目錄

題目鏈結 

演算法1dijkstra暴力求解

演算法2 a*演算法

題目很直接,就是求第k短路

dijkstra可以求解第k短路:

dijkstra演算法是基於貪心的,回顧一下堆優化的dijkstra,從堆中第一次取到的目標點的dist值是最小值,因為我們之前只求最短路,因此還會用乙個

這裡就不需要寫,

但是這個演算法,太過於暴力,會多遍歷好多點,一般情況下會tle(除非資料特別弱)。

tle**

/**

* author : correct

*/#include using namespace std;

#define mem(a, b) memset(a, b, sizeof a)

const int n = 1010, m = 100200;

int head[m], nex[m], to[m], ed[m], cnt;

void add(int a, int b, int c)

int number[n];

int dist[n];

int s, t, k, n, m;

struct p

p(int x, int y)

bool operator < (const p& a)const

bool operator > (const p& a)const

};void dijkstra()

for (int i = head[t.x]; ~i; i = nex[i]) }}

int main()

cin >> s >> t >> k;

if (s == t)k++;// 題目中說每個k短路至少含一條邊,對於起點和終點相同的情況

//顯然應該去掉自身到自身為0的情況,可以通過求k+1短路間接實現

dijkstra();

if (dist[k] == 0x3f3f3f3f)dist[k] = -1;

cout << dist[k];

return 0;

}

上述演算法太暴力,超時很正常,需要優化。 可以扔給tle演算法乙個啟發函式,讓他每次選擇乙個盡可能優的點去擴充套件。a*演算法。

定義乙個函式要求:

如果一定要滿足。如果過分的小了,就比如

本題中啟發函式的選取,可以建立反邊,然後用從t開始的到每個頂點的最短路當作啟發函式的值。因為最短路一定滿足上述條件,而且非常接近。

輸入完畢後,建立反向邊,然後堆優化dijkstra跑一遍以t為源點的最短路,將每個dist值當作啟發函式的值。然後跑a*。

ac**

/**

* author : correct

*/#include using namespace std;

#define mem(a, b) memset(a, b, sizeof a)

const int n = 1010, m = 100200;

int head[n], nex[m], to[m], ed[m], cnt, head2[n];

void add(int* h, int a, int b, int c)

int number[n];

int dist[n];

bool vis[n];

int s, t, k, n, m;

int f(int x)

struct p

p(int x, int y)

bool operator < (const p& a)const

bool operator > (const p& a)const

};struct p1

p1(p a, int sum)

bool operator < (const p1& t)const

bool operator > (const p1& t)const

};void dijkstra()

} }}int a_star()

for (int i = head[t.a.x]; ~i; i = nex[i])

} return -1;

}int main()

cin >> s >> t >> k;

if (s == t)k++;// 最少包含一條邊

dijkstra();

cout << a_star();

return 0;

}

a*其實就是比堆優化多了乙個啟發式函式,當然,也可以將堆優化看成是啟發式函式結束語:為什麼要放入犯傻的記錄中呢?其實這個題我tle+wa了一下午,原因是建立反邊的時候有乙個表頭沒有初始化,然後就是中間有乙個點的記號寫錯了,查錯半天qaq

一次重新的認識 第二次隨筆

模組獨立性指每個模組只完成系統要求的獨立子功能,並且與其他模組的聯絡最少且介面簡單,兩個定性的度量標準 耦合性和內聚性。耦合性也稱塊間聯絡。指軟體系統結構中各模組間相互聯絡緊密程度的一種度量。模組之間聯絡越緊密,其耦合性就越強,模組的獨立性則越差。模組間耦合高低取決於模組間介面的複雜性 呼叫的方式及...

C primer第二次閱讀學習筆記(第3章)

第三章 在標頭檔案中應該使用完全限定的標準庫名字,如std cout 而不應該使用 using std cout 或using namespaces std 在標頭檔案中放置 using 宣告,就相當於在包含該標頭檔案的每個程式中都放置了同一 using 宣告。應該在標頭檔案中包含確實需要的東西,遵...

C primer第二次閱讀學習筆記(第4章)

c 語言應盡量使用 vector 和迭代器型別,應避免使用低階的陣列和指標,涉及良好的程式只有在強調速度時才在類實現的內部使用陣列和指標。因此要向成為乙個真正的 c 程式設計師就要多使用 vector 和string 來替代陣列和 c風格字串。陣列的維數必須用整型常量指定,非const 型別或是到執...