SCU 最短路 Dijkstra 鄰接表

2021-09-02 11:35:31 字數 1521 閱讀 2251

time limit:1000ms memory limit:32768k

給定乙個n個節點,m條有向邊的圖,再給你起點和終點,請問其中有多少條互不重疊的從起點到終點的最短路,即互相沒有公共邊的最短路個數(可以有公共點),用過邊的不能再用。

輸入第一行有乙個t,表示樣例個數。(t≤60)

每個樣例第一行有兩個整數n,m(n≤1000,m≤100000)

然後是m行,代表每一條邊的起點終點和權值。 

然後是乙個兩個整數,代表起點和終點。

輸出最短路個數。

4

4 41 2 1

1 3 1

2 4 1

3 4 1

1 47 8

1 2 1

1 3 1

2 4 1

3 4 1

4 5 1

4 6 1

5 7 1

6 7 1

1 76 7

1 2 1

2 3 1

1 3 3

3 4 1

3 5 1

4 6 1

5 6 1

1 62 2

1 2 1

1 2 2

1 2

221

1

最短路問題,使用鄰接表的方法存邊,再跑一遍dijkstra演算法(優先佇列),最後搜尋一下,把能到達終點的邊找出來,只要用過的就不能用了。這裡我沒用stl裡面的優先佇列,我用的是陣列型的佇列,方便每次都讓最短的邊出隊。

#include #include #include #include #include #define n 1010

using namespace std;

struct edgg q[n * n];

struct edge e[100 * n];

struct edga pre[n];

int cnt, f[n], vis[n], dis[n], vish[100 * n];

void add(int u, int v, int w) ;

f[u] = cnt;

}void q_sort(struct edgg a, int n, int min)

void dijkstra(int s)

else if (dis[v] == t.s + e[i].w) }}

}void dfs(int v)

}int main()

scanf("%d%d", &s, &t);

memset(vish, 0, sizeof(vish));

dijkstra(s);

dfs(t);

for (int i = f[s]; i; i = e[i].u)

if (vish[i])

ans++;

printf("%d\n", ans);

}return 0;

}

Dijkstra 最短路徑

dijkstra 最短路徑 針對有向圖,不支援負權值 圖的相鄰矩陣表示方法,還要用到最小值堆 include include define unvisited 0 define visited 1 define infinite 9999 設定最大值 define n 5 定義圖的頂點數 using...

dijkstra最短路徑

hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外n 1個地方,這些地方都能互相到達,且所有的邊都是有方向的。現在hehe要做的事就是去那些地方找回那n 1件禮物給xixi 由於每一件禮物都有特殊的意義,所以xixi要求hehe每找到一件禮物,就必...

最短路 Dijkstra演算法

dijksitra演算法求最短路僅僅適用於不存在右邊是負權的情況 bellman ford演算法沒有這乙個限制 主要特點是從起點為中心向外層層擴充套件,直到擴充套件到終點為止。即乙個最短路路徑中經過的所有點這條路均是其最短路。反證法易證 dijkstra基本思路 找到最短距離已經確定的頂點,從它出發...