这是bfs的大体思路
我主要是不知道1.怎么储存连接表2.bfs怎么写,怎么求到每个点的最短路
比如这题输入 1 2,2 3,4 5,4 6,6 7,1 3
for(int i=1;i<=m;i++)//共m条边
{
int v,u;
cin>>v>>u;
e[v].push_back(u);
e[u].push_back(v);//存表 e[1]={2,3],e[2]={1,3}
}
2.bfs写法,用队列
void bfs(int st)
{
queue<int> q;
q.push(st);
d[st]=1;//标记起点走过,并且假设到起点需1个边,若题目其实到起点为0条边可以结果时-1
while(!q.empty())
{
int t=q.front();
q.pop();//取首元素并弹出,一定要pop否则会死循环
for(auto v:e[t])//遍历与t相连的所有点
{
if(!d[v])//没走过
{
d[v]=d[t]+1;
q.push(v);//下一次再从这个点开始遍历找连接点
}
}
}
}
https://atcoder.jp/contests/abc309/tasks/abc309_d此题链接
bfs(1),从起点遍历,由图可得d[2]=2,d[3]=2,实际到2最短路为2-1=1
2.太久没练习忘了pair写法
pair<int,int> a[N];
第一个元素 a[i].first,第二个 a[i].second
如果按第一个元素的由小到大排序
bool cmp(pair<int,int>a,pair<int,int> b)
{
return a.first<b.first;
}
sort(a,a+n,cmp);
3.给一个数组全赋值-1写法
memset(a,-1,sizeof(a));