#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T> inline void gmax(T &a,T b){if(b>a)a=b;}
template <class T> inline void gmin(T &a,T b){if(b<a)a=b;}
const int N=400+5,M=0,Z=1e9+7,ms63=1061109567;
int n,m;
int x,y;
bool a[N][N];
bool vis[N];
int BFS(bool w)
{
MS(vis,0);
queue< pair<int,int> >q;
q.push(MP(1,0));
while(!q.empty())
{
int x=q.front().first;
int step=q.front().second+1;
q.pop();
for(int i=1;i<=n;++i)if(!vis[i]&&a[x][i]==w)
{
if(i==n)return step;
q.push(MP(i,step));
vis[i]=1;
}
}
return -1;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
MS(a,0);
for(int i=1;i<=m;++i)
{
scanf("%d%d",&x,&y);
a[x][y]=a[y][x]=1;
}
int ans;
if(a[1][n])ans=BFS(0);
else ans=BFS(1);
printf("%d\n",ans);
}
return 0;
}
/*
【trick&&吐槽】
这题超水!
【题意】
给你一个完全图。
图上任意两点间都有且仅有一条边。
这条边的类型可以是1或者0。1表示公交,0表示地铁。
我们现在2个人要分别乘坐公交或地铁
现在这2个人都同时要从1点出发,目标是到达n点,到达后便会停在n点。
然而两个人在出发后,在n点之间,不能同时在同一个点。
问你这两个人最早的在n点相遇的时间。
【类型】
最短路
【分析】
"两个人在出发后,在n点之间,不能同时在同一个点。"
这个限制,乍一看会让我们感到很棘手。然而实际上,随便思考下,这个限制便没有了任何意义——
肯定有一条边是1->n,我们通过该交通方式,可以在时间1直接到达n点。
不仅速度最快,而且不会与另外一种交通方式产生冲突。最优。所以我们一定会选它。
这时,我们只需要沿着另外一种交通方式走,求从1到n的最短路,即是答案。
【时间复杂度&&优化】
O(n^2)
*/
【Codeforces Round 333 (Div 2)C】【最短路】The Two Routes 完全图两种双向边的最小最大距离
最新推荐文章于 2022-05-14 21:00:10 发布