最短路简化版(邻接矩阵和邻接表)
2017-07-20 20:42
609 查看
经历一周忙碌的工作后,蒜头君想趁着周末好好游玩一番。蒜头君想去好多好多地方,他想去南锣鼓巷吃各种好吃的,想去颐和园滑冰,还想去怀柔滑雪场滑雪……可是时间有限,蒜头君并不能玩遍所有的地方,最后他决定去几个离他较近的。
我们知道蒜头君一共想去 NN 个地方玩耍,编号从 11 到 NN,并且知道了蒜头君所在地方的编号 CC,以及 MM 条路径。现在蒜头君想让你帮他算一算,他到每个地方分别需要经过多少个地方?
M, CN,M,C。代表蒜头君想去 NN 个地方,有 MM 条路径,蒜头君在编号为 CC 的地方。1
\leq N, C \leq 10001≤N,C≤1000, 1
\leq C \leq N1≤C≤N, 1
\leq M \leq 100001≤M≤10000。
保证没有重复边,且图中所有点互相连通。
开始邻接矩阵做,超时一组,看着觉得只超了一点,实际上只是超时了程序就停止了。然后改用邻接表,其实在这题上邻接表优势特别明显。题目思路很简单,直接bfs加一个计数数组。
邻接矩阵(有一组未过)
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int G[1005][1005],ans[1005];
int n,m,c;
void fun()
{
int flag[1005]={0};
int last=c;
int cnt=0;
int foll;
queue<int>q;
flag[c]=1;
q.push(c);
while(!q.empty())
{
int temp=q.front();
q.pop();
// if(temp==x)
// break;
ans[temp]=cnt;
for(int i=1;i<=1000;i++)
{
if(G[temp][i]==1&&!flag[i])
{
flag[i]=1;
q.push(i);
foll=i;
}
}
if(temp==last)
{
cnt++;
last=foll;
}
}
// return cnt;
}
int main()
{
cin>>n>>m>>c;
while(m--)
{
int a,b;
cin>>a>>b;
G[a][b]=1;
G[b][a]=1;
}
for(int i=1;i<=n;i++)
{
// int ans=fun(i);
fun();
cout<<ans[i]<<endl;
}
return 0;
}邻接表(AC)#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int G[1005][1005],ans[1005];
vector<vector<int> >arr(1005);
int n,m,c;
void fun()
{
int flag[1005]={0};
int last=c;
int cnt=0;
int foll;
queue<int>q;
flag[c]=1;
q.push(c);
while(!q.empty())
{
int temp=q.front();
q.pop();
// if(temp==x)
// break;
ans[temp]=cnt;
for(int i=0;i<arr[temp].size();i++)
{
if(!flag[arr[temp][i]])
{
flag[arr[temp][i]]=1;
q.push(arr[temp][i]);
foll=arr[temp][i];
}
}
if(temp==last)
{
cnt++;
last=foll;
}
}
// return cnt;
}
int main()
{
cin>>n>>m>>c;
while(m--)
{
int a,b;
cin>>a>>b;
arr[a].push_back(b);
arr[b].push_back(a);
}
for(int i=1;i<=n;i++)
{
// int ans=fun(i);
fun();
cout<<ans[i]<<endl;
}
return 0;
}
我们知道蒜头君一共想去 NN 个地方玩耍,编号从 11 到 NN,并且知道了蒜头君所在地方的编号 CC,以及 MM 条路径。现在蒜头君想让你帮他算一算,他到每个地方分别需要经过多少个地方?
输入格式
第一行输入三个正整数 N,M, CN,M,C。代表蒜头君想去 NN 个地方,有 MM 条路径,蒜头君在编号为 CC 的地方。1
\leq N, C \leq 10001≤N,C≤1000, 1
\leq C \leq N1≤C≤N, 1
\leq M \leq 100001≤M≤10000。
保证没有重复边,且图中所有点互相连通。
输出格式
输出 NN 行,按编号从小到大,输出结果。第 ii行表示蒜头君到编号为 ii 的地方,需要经过多少个地方。样例输入
5 5 2 1 2 2 3 2 4 3 4 3 5
样例输出
1 0 1 12
开始邻接矩阵做,超时一组,看着觉得只超了一点,实际上只是超时了程序就停止了。然后改用邻接表,其实在这题上邻接表优势特别明显。题目思路很简单,直接bfs加一个计数数组。
邻接矩阵(有一组未过)
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int G[1005][1005],ans[1005];
int n,m,c;
void fun()
{
int flag[1005]={0};
int last=c;
int cnt=0;
int foll;
queue<int>q;
flag[c]=1;
q.push(c);
while(!q.empty())
{
int temp=q.front();
q.pop();
// if(temp==x)
// break;
ans[temp]=cnt;
for(int i=1;i<=1000;i++)
{
if(G[temp][i]==1&&!flag[i])
{
flag[i]=1;
q.push(i);
foll=i;
}
}
if(temp==last)
{
cnt++;
last=foll;
}
}
// return cnt;
}
int main()
{
cin>>n>>m>>c;
while(m--)
{
int a,b;
cin>>a>>b;
G[a][b]=1;
G[b][a]=1;
}
for(int i=1;i<=n;i++)
{
// int ans=fun(i);
fun();
cout<<ans[i]<<endl;
}
return 0;
}邻接表(AC)#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int G[1005][1005],ans[1005];
vector<vector<int> >arr(1005);
int n,m,c;
void fun()
{
int flag[1005]={0};
int last=c;
int cnt=0;
int foll;
queue<int>q;
flag[c]=1;
q.push(c);
while(!q.empty())
{
int temp=q.front();
q.pop();
// if(temp==x)
// break;
ans[temp]=cnt;
for(int i=0;i<arr[temp].size();i++)
{
if(!flag[arr[temp][i]])
{
flag[arr[temp][i]]=1;
q.push(arr[temp][i]);
foll=arr[temp][i];
}
}
if(temp==last)
{
cnt++;
last=foll;
}
}
// return cnt;
}
int main()
{
cin>>n>>m>>c;
while(m--)
{
int a,b;
cin>>a>>b;
arr[a].push_back(b);
arr[b].push_back(a);
}
for(int i=1;i<=n;i++)
{
// int ans=fun(i);
fun();
cout<<ans[i]<<endl;
}
return 0;
}
相关文章推荐
- HDU2544_最短路(Dijkstra)(Bellman-Ford)(SPFA+邻接表/邻接矩阵)
- 最短路问题(4种方法)(邻接矩阵,邻接表,bellman-ford,spfa)
- HDU 2544 最短路 floyd djkstra(邻接表,邻接矩阵) spfa bellman-ford 模板题
- 基于vector的邻接表解决最短路稀疏图的问题
- 邻接表与邻接矩阵的深度优先算法和广度优先算法
- 2017.9.9 图论 — 最短路(修邻接表bug---10.20)
- 无向图的邻接矩阵和邻接表实现各种操作 -- C++语言描述
- C++继承实现邻接矩阵和邻接表
- Dijkstra单源最短路,邻接矩阵形式(模板)
- 再写_邻接表和邻接矩阵存储图
- 图的邻接表和邻接矩阵
- 【数据结构】图的存储方式:邻接矩阵和邻接表
- [gotoac]网络流SAP(邻接表&邻接矩阵) beta2
- 邻接表和邻接矩阵手写简洁代码DFS BFS
- 第十二周-图及其存储结构(邻接矩阵·邻接表)算法库
- 数据结构之自建算法库——图及其存储结构(邻接矩阵、邻接表)
- DFS分别用邻接矩阵和邻接表访问
- Dijistra求最短路(邻接表存储,前向星存储,堆优化)
- 邻接矩阵转邻接表
- POJ 1724 ROADS 最短路 邻接表 + bfs +优先队列