time limit:1000ms memory limit:32768k
給定乙個n個節點,m條有向邊的圖,再給你起點和終點,請問其中有多少條互不重疊的從起點到終點的最短路,即互相沒有公共邊的最短路個數(可以有公共點),用過邊的不能再用。
輸入第一行有乙個t,表示樣例個數。(t≤60)
每個樣例第一行有兩個整數n,m(n≤1000,m≤100000)
然後是m行,代表每一條邊的起點終點和權值。
然後是乙個兩個整數,代表起點和終點。
輸出最短路個數。
44 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最短路問題,使用鄰接表的方法存邊,再跑一遍dijkstra演算法(優先佇列),最後搜尋一下,把能到達終點的邊找出來,只要用過的就不能用了。這裡我沒用stl裡面的優先佇列,我用的是陣列型的佇列,方便每次都讓最短的邊出隊。1
#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基本思路 找到最短距離已經確定的頂點,從它出發...