PTA6-2 两顶点之前有路径吗?
分数 15
作者 周强
单位 青岛大学
对于给定的无向图及两个图中的顶点,请实现一个函数,分别打印包含这两个顶点的连通分量中的顶点数,并判断这两个顶点之间是否有路径。
函数接口定义:
int hasPath(struct Graph *g, int v, int w);
其中v和w是顶点
图定义如下:
#define MaxVertexNum 20 /* 最大顶点数 */
struct Graph{
int v; /* 顶点数量 */
int Adj[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
题目保证图至少有一个顶点
函数分别在第一行和第二行打印包含v和w的连通分量中顶点的数量。
如果 v和w之间有路径,函数返回1, 否则返回0.
提示:
你可以定义多个函数,也可以定义全局变量.
当v和w是同一个顶点时,认为v和w之间是有路径的。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#define MaxVertexNum 20 /* 最大顶点数设为20 */
struct Graph{
int v; // amount of vertices
int Adj[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
int visited[MaxVertexNum]; /* 顶点的访问标记 */
struct Graph* CreateGraph(){
int v;
scanf("%d",&v);
struct Graph* g;
g = malloc(sizeof(struct Graph));
if(!g) return NULL;
g->v = v;
for(int i=0; i<v; i++){
visited[i] = 0;
for(int j=0; j<v; j++)
scanf("%d",&(g->Adj[i][j]));
}
return g;
}
int hasPath(struct Graph *g, int v, int w);
int main(){
struct Graph* g;
g = CreateGraph();
int v,w;
scanf("%d%d", &v, &w);
printf("%s\n", hasPath(g,v,w) ? "Yes" : "No");
return 0;
}
/* 你的代码将被嵌在这里 */
图为:
7-0-2-4 3-5 6
\1/
对于此图及样例测试程序规定的输入格式:
输入样例:
8
0 1 1 0 0 0 0 1
1 0 0 0 1 0 0 0
1 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 1 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 3
Sample Output:
5
2
No
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
请问为什么下面的代码运行出来段错误?
int *pre;
int count=1;
int firstadj(struct Graph *g, int v)
{
int i;
for(i=0;i<g->v;i++)
{
if(g->Adj[v][i]==1)
{
count=2;
return i;
}
}
if(i==g->v) //孤立点
{
count=1;
return -1;
}
}
int nextadj(struct Graph *g, int v, int w)
{
int i;
for(i=w+1;i<g->v;i++)
{
if(g->Adj[v][i]==1)
{
count++;
return i;
}
}
if(i==g->v) return -1;//w是v的最后一个邻接点
}
void init(struct Graph *g, int v)
{
int i;
pre=(int*)malloc(g->v*sizeof(int));
for(i=0;i<g->v;i++) pre[i]=-1;
pre[v]=-2;
}
int hasPath(struct Graph *g, int v, int w)
{
int j=firstadj(g,v);
if(j==-1) return 0;//孤立点
init(g,v);
while(j>=0)
{
if(pre[j]==-1)
{
pre[j]=v;
if(j==w)
{
printf("%d\n",count);
return 1;//有路径
}
else if(hasPath(g,j,w))
{
printf("%d\n",count);
return 1;//有路径
}
}
j=nextadj(g,v,j);
}
count=0;
j=firstadj(g,w);
while(j>=0)
{
j=nextadj(g,w,j);
}
printf("%d\n",count);
return 0;//无路径
}