数据结构作业
使用BFS解决边长为1的图的单源最短路问题(有向图)
输入:
第一行是两个由空格隔开的正整数, n m。
n为点数,m为边数。
n小于等于10000,m小于等于100000。
点的编号为0 ~ n-1
接下来的m行,每行为两个由空格隔开的非负整数x y,表示从x点到y点有一条边。
输出:
n个整数,由空格隔开。分别表示0 ~ n-1号结点距离0号结点的最短路径长度。(每条边长度视为1)
0号点与自己的最短路径长度是0。
注意:图可能不连通!不连通的点请输出-1
代码如下,完全手敲,实在太菜,敲了俩小时。。。
#include <iostream>
#include <cstring>
#include <queue>
#define MAX 10000
using namespace std;
typedef struct EdgeNode{
int adjvex;
bool weight;
EdgeNode *next;
}EdgeNode;
typedef struct{
int data;
EdgeNode *firstedge;
}AdjList[MAX];
typedef struct{
AdjList adjlist;
int numVertices,numEdges;
}GraphAdjList;
bool visited[MAX];
int ans[MAX];
void CreateALGraph(GraphAdjList& g){
cin>>g.numVertices>>g.numEdges;
//初始化
for(int i=0;i<g.numVertices;i++){
g.adjlist[i].data=i;
g.adjlist[i].firstedge=NULL;
}
//创建邻接表
for(int i=0;i<g.numEdges;i++){
int x,y;
cin>>x>>y;
EdgeNode *e=new EdgeNode;
e->weight=1;
e->next=g.adjlist[x].firstedge;
e->adjvex=y;
g.adjlist[x].firstedge=e;
//辣鸡助教说是有向图,给的测试数据和答案是无向图
//真正的有向图应该没有下面这几行
//无向图才要这样
e=new EdgeNode;
e->weight=1;
e->next=g.adjlist[y].firstedge;
e->adjvex=x;
g.adjlist[y].firstedge=e;
}
}
//工作代码bfs
void Work(const GraphAdjList& g){
//bfs是用队列解决的,用stl比手写队列方便多了,其实就是不会手写队列。。。(bushi)
queue<int> q;
memset(ans,0,sizeof(ans));
//各种flag是不知道怎么实现才用的,可以自行优化
for(int i=1;i<g.numVertices;i++){
int flag=0;
memset(visited,false,sizeof(visited));
visited[i]=true;
q.push(i);
while(q.empty()!=true){
EdgeNode *p=g.adjlist[q.front()].firstedge;
q.pop();
ans[i]++;
while(p!=NULL){
if(p->adjvex==0){;
q=queue<int>();
flag=1;
break;
}
if(visited[p->adjvex]==false){
visited[p->adjvex]=true;
q.push(p->adjvex);
}
p=p->next;
}
if(flag==1){
break;
}
}
if(flag==1){
flag=0;
continue;
}
if(q.size()==0){
ans[i]=-1;
}
}
//辣鸡助教给的答案最后一个数后面没有空格,要单独输出
for(int i=0;i<g.numVertices;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}
//从main开始写
int main(){
GraphAdjList gl;
//写函数的意识
CreateALGraph(gl);//ALGraph就是adjacency list graph
Work(gl);//bfs
//C++不写return 0; 默认为return 0;
}