邮差送信
题目内容:
有一个邮递员要在n个城市之间来回送信。但有的城市之间有大路相连而有的没有路。
现在要由一个城市到另一个城市送信,中途最少要经过多少个其它的城市呢?
输入描述
第一行是n,k(1<=n<=10000, 1<=k<=20000),接下来就是k行。这k行每行有两个数a,b(1<=a,b<= n),表示城市a和b之间有
大路k行以后就是两个数p和q。
输出描述
输出从城市p到城市q之间最少要经过的其它的城市的数目。如果p和q之间不连通则输出0
输入样例
6 6
1 4
1 2
2 3
3 4
5 4
5 6
1 6
输出样例
2
==一开始抽了下想用dfs或者bfs来做, 但想到的方法复杂度太大了,试都不想试, 让后直接用了dijkstra算法, 如果n过大可以用Bellman-Ford, 算法盲打是打不出来了熟悉了下最短路算法最短路算法
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<vector>
#include<stack>
using namespace std;
typedef long long ll;
int m[10000][10000];
int n, k, p, q;
bool vis[10000];
int d[10000];
int inf = 0x3f3f3f3f;
void solve()
{
while (true)
{
int v = -1;
for (int i = 1; i <= n; i++)
if(!vis[i] && (v == -1 || d[i] < d[v])) v = i;
if (v == -1) break;
vis[v] = true;
for (int i = 1; i <= n; i++)
d[i] = min(d[i], d[v] + m[v][i]);
}
}
int main()
{
memset(d, 0x3f, sizeof(d));
memset(m, 0x3f, sizeof(m));
cin >> n >> k;
for (int i = 0; i < k; i++)
{
int a, b;
cin >> a >> b;
m[a][b] = 1;
m[b][a] = 1;
}
cin >> p >> q;
d[p] = 0;
solve();
if (d[q] != inf)
cout << d[q] - 1;
else
cout << "0";
}