题目描述
从创客出来后,你忽然发现你居然把自己的电脑落在了创客里,这可怎么AC呀,但是创客的老大爷已经把大门锁上了。更糟的是,你没有大爷的电话号码。你开始给你知道的所有人打电话,询问他们有没有大爷的电话,如果没有,他们也会问自己的同学来询问电话号码。那么,你能联系到大爷并且拿到电脑吗。
输入
存在多组测试样例
每组样例的第一行分别是两个整数n(1<n<=50),m(1<m<=2000),n是在题目当中出现的人数,其中你的序号是1号,大爷的序号是n。
接下来的m行,每行有两个整数x(1<=x<=n),y(1<=y<=n),代表x有y的电话号码。
输出
对于每组测试样例,如果你最终能联系到大爷,输出“Yes”,否则输出“No”。
样例输入
5 5
1 3
2 3
3 4
2 4
4 5
4 3
1 2
2 3
4 1
样例输出
Yes
No
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn = 2005;
const int inf = 100000;
int n, bian, u, v, cost;
int mp[maxn][maxn];
int dis[maxn], pre[maxn];
void init()
{
cin >> n >> bian;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
mp[i][j] = inf;//100000
for (int i = 0; i < bian; i++)
{
cin >> u >> v;
cost = 1;
mp[u][v] = cost;
mp[v][u] = cost;
}
for (int i = 1; i <= n; i++)
{
dis[i] = inf;
}
}
void dijkstra(int n, int v)//v=1;
{
bool vis[maxn];
for (int i = 1; i <= n; i++)
{
vis[i] = false;
dis[i] = mp[v][i];
if (dis[i] == inf)
{
pre[i] = 0;
}
else pre[i] = v;
}
dis[v] = 0;
vis[v] = true;
for (int i = 2; i <= n; i++)
{
int u = v;
int mazz = inf;
for (int j = 1; j <= n; j++)
{
if (!vis[j] && dis[j] < mazz)
{
u = j;
mazz = dis[j];
}
}
vis[u] = true;
for (int k = 1; k <= n; k++)
{
if (!vis[k] && mp[u][k] < inf)
{
if (dis[k] > mp[u][k] + dis[u]) {
dis[k] = mp[u][k] + dis[u];
pre[k] = u;
}
}
}
}
}
int main()
{
while (cin >> n >> bian)
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
mp[i][j] = inf;
for (int i = 0; i < bian; i++)
{
cin >> u >> v;
cost = 1;
mp[u][v] = cost;
}
for (int i = 1; i <= n; i++)
{
dis[i] = inf;
}
dijkstra(n, 1);
if (dis[n] != inf)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}