此时,重要的就来了,这题怎么做: 读到这,你肯定会情不自禁的感叹一声:emm 题目: 【B】图的遍历
【题目描述 graph.cpp】
给定一张n个点的图,求该图从1开始的深度优先序和广度优先序。
【输入格式 graph.in】
第一行一个整数n。
之后n行,为n*n的01矩阵,第i行第j列表示图上i和j是否有连边。
【输出格式 graph.out】
第一行n个数,表示图的深度优先序。
第二行n个数,表示图的广度优先序。
【样例】
【输入样例1】
8
0 1 1 1 0 0 0 0
1 0 0 0 0 1 0 0
1 0 0 0 1 0 0 0
1 0 0 0 1 1 1 0
0 0 1 1 0 0 0 0
0 1 0 1 0 0 0 0
0 0 0 1 0 0 0 1
0 0 0 0 0 0 1 0
【输出样例1】
1 2 6 4 5 3 7 8
1 2 3 4 6 5 7 8
【数据规模】
n≤100。
而这是我的代码:
#include <bits/stdc++.h>
#define int long long
#pragma GCC optimize("02")
using namespace std;
int n,i,j,x,y,f[100010],fx,sx,t,w,c[100010];
vector <int> a[100010],b[100010];
void sc(int x){
int i;
cout<<x<<" ";
for(i=0;i<a[x].size();i++)
if(!f[a[x][i]])f[a[x][i]]=1,sc(a[x][i]);
}
main(){
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
cin>>x;
if(x==1) a[i].push_back(j),a[j].push_back(i);
}
f[1]=1;sc(1);cout<<"\n";memset(f,0,sizeof(f));
t=w=1;c[1]=1;f[1]=1;
while(t<=w){
fx=c[t];cout<<fx<<" ";
for(i=0;i<a[fx].size();i++){
sx=a[fx][i];
if(f[sx]==0) f[sx]=1,c[++w]=sx;
}
t++;
}
return 0;
}
求问,为何爆0