题目:On Average They’re Purple
示例1
输入
3 3
1 3
1 2
2 3
输出
0
示例2
输入
7 8
1 2
1 3
2 4
3 4
4 5
4 6
5 7
6 7
输出
3
题意:
——求1到n的最短路,再减1即可。题意可能不太容易明白,多琢磨琢磨。
代码1:(vector容器构建邻接表)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int N=110000;
const int M=110000;
vector<int> vt[N];//
int book[N];
int n,m;
struct Node{
int x,s;
};
void bfs()
{
queue<Node> Q;
struct Node u,v;
memset(book,0,sizeof(book));
book[1]=1;
u.x=1;
u.s=0;
Q.push(u);
int x,s,tx,ts,i;
while(!Q.empty())
{
u=Q.front();
Q.pop();
x=u.x;
s=u.s;
if(x==n)
{
printf("%d\n",s-1);
return;
}
for(i=0;i<vt[x].size();i++)
{
tx=vt[x][i];
ts=s+1;
if(book[tx]==0)
{
book[tx]=1;
v.x=tx;
v.s=ts;
Q.push(v);
}
}
}
}
int main()
{
scanf("%d %d",&n,&m);
while(m--)
{
int a,b;
scanf("%d %d",&a,&b);
vt[a].push_back(b);
vt[b].push_back(a);
}
bfs();
return 0;
}
代码2:(数组模拟构建邻接表)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int N=110000;
const int M=110000;
int first[N],nx[2*M],to[2*M];
int book[N];
int n,m,head;
struct Node{
int x,s;
};
void add(int x,int y)
{
nx[head]=first[x];
first[x]=head;
to[head++]=y;
}
void bfs()
{
queue<Node> Q;
struct Node u,v;
memset(book,0,sizeof(book));
book[1]=1;
u.x=1;
u.s=0;
Q.push(u);
int x,s,tx,ts,i;
while(!Q.empty())
{
u=Q.front();
Q.pop();
x=u.x;
s=u.s;
if(x==n)
{
printf("%d\n",s-1);
return;
}
for(i=first[x];i!=-1;i=nx[i])
{
tx=to[i];
ts=s+1;
if(book[tx]==0)
{
book[tx]=1;
v.x=tx;
v.s=ts;
Q.push(v);
}
}
}
}
int main()
{
head=1;
memset(first,-1,sizeof(first));
scanf("%d %d",&n,&m);
while(m--)
{
int a,b;
scanf("%d %d",&a,&b);
add(a,b);
add(b,a);
}
bfs();
return 0;
}