介绍5种存图的方法
1.邻接矩阵
const int N =1e3+9;
int G[N][N];//G[i][j]即val(i->j)
void dfs(int u){
vis[u] = 1;
for(int v=1 ; v<=n ; ++v){
if(G[u][v]!=0){
printf("%d %d %d ",u,v,G[u][v]);
if(!vis[v]) dfs(v);
}
}
}
void bd(){
cin>>n>>m;
for(int i=1;i<=m;++i){
int u,v,val;
cin>>u>>v>>val;
G[u][v] = val;
//G[v][u] = val;//无向图
}
for(int i=1 ; i<=n ; ++i){
if(!vis[i]) dfs(i);
}
}
2.边集数组
struct node{
int u ,v, val;
//start end value
}
bool vis[N];
void dfs(int u){
vis[u] = 1;
for(int i=1 ; i<=m ; ++i){
if(e[i].u == u){
int end = e[i].v;
int value = e[i].value;
printf("%d %d ,%d ",u,end,value);
}
}
}
void bd(){
cin>>n>>m;
for(int i =1 ; i<=m;++i{
int u,v,val;
cin>>u>>v>>val;
e[i].u=u;
e[i].v=v;
e[i].val = val;
}
for(int i=1;i<=n;++i){
if(!vis[i]) dfs(i);
}
3.邻接表
struct node{
int v,val;
};
vec<node>edge[N];
void dfs(int u){
vis[u]=1;
for(int i=0;i<e[u].size();++i){
int end = e[u][i].v;
int val = e[u][i].val;
printf("(%d,%d) %d",u,end,val);
if(!vis[end]) dfs(end);
}
}
void bd(){
cin>>n>>m;
for(int i=1;i<=m;++i){
int v,val;
cin>>v>>val;
edge[u].push_back({v,val});
}
for(int i=1;i<=n;++i){
if(!vis[i]) dfs(i);
}
}
4.链式邻接表
struct node{
int u,v,val;
};
vec<node>e;
bool vis[N];
vec<int>head[N];
void add(int u,int v,int w){
e.push_back({u,v,w});
h[u].push_back(e.size()-1);
}
void dfs(int u){
vis[u]=1;
for(int i=0;i<h[u].size();++i){
int idx = h[u][j];
int next = e[idx].v;
int val = e[idx].val;
printf("(%d,%d) %d",u,next,val);
if(!vis[next]) dfs(next);
}
}
void bd(){
cin>>n>>m;
for(int i=1;i<=m;++i){
int u,v,w;
add(u,v,w);
}
for(int i=n;i<=n;;++i){
if(!vis[i]) dfs(i);
}
}
5.链式前项星
struct node{
int to,val,next;
};
int head[N],idx=0;
node e[N];
void add(int u,int v,int val){
e[idx] = {v,val,head[u]};
head[u] = idx++;
}
void dfs(int u){
vsi[u]=1;
for(int i=head[u];i!=-1;i=e[i].next){
int v= e[i].to
int val = e[i].val;
printf("%d %d %d",,u,v,val);
if(!vis[u) dfs(v);
}
}
void bd(){
cin>>n>>m;
memset(head,-1,sizeof(head));
for(int i=1;i<=m;++i){
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
}
for(int i=1;i<=n;++i){
if(!vis[i) dfs(i);
}
}