之前一直是用点跑dfs,结果发现稀疏图的时候这样跑很慢
所以,用数组模拟的邻接表跑边还好些
下面是跑点的深度的dfs
#include<cstdio>
#include<iostream>
#define L 1005
using namespace std;
int n, m, tot;
struct node{
int to, nxt, val; //nxt存同一出发点的上一条边; to存这条边终点; val存这条边权值;
}edge[L];
bool flag[L];
int head[L], dep[L]; //下标指点的编号; 数组存存的最后一条从该点出发的边的编号;
void add_edge(int from, int to, int dis){
edge[++tot].nxt = head[from]; edge[tot].to = to; edge[tot].val = dis; head[from] = tot;
}
void dfs(int cur, int depth){
dep[cur] = depth;
for(int i=head[cur];i;i=edge[i].nxt){ //dfs跑边的顺序与存入时相反;
if(!flag[i]) flag[i] = true, dfs(edge[i].to, dep[cur]+1);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u, v, d;
scanf("%d%d%d",&u,&v,&d);
add_edge(u, v, d);
}
dfs(1, 1);
for(int i=1;i<=n;i++) printf("%d ",dep[i]);
return 0;
}