您的位置:首页 > 其它

图的三种存储方式

2013-02-22 10:37 120 查看
之前总结过一次。详见本博客或者是另一篇

不过呢。写起来。还是今天的简单易写(学长教的)。

测试数据my.txt.



邻接矩阵:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXN 100

const int INF = (1<<23);

int G[MAXN][MAXN];

int main(){
//freopen("d:\\my.txt", "r", stdin);
int n, m, i, j, u, v, w;

scanf("%d %d", &n, &m);
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
G[i][j] = INF;

for(i=0; i<m; i++){
scanf("%d %d %d", &u, &v, &w);
G[u][v] = G[v][u] = w;  //无向图
}

for(i=1; i<=n; i++){
printf("与%d相关联的顶点有:\n", i);
for(j=1; j<=n; j++)if(G[i][j] != INF){
printf("%d ", j);
}
putchar('\n');
}

return 0;
}


边表:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXM 100    //最大边数
#define MAXN 10   //最大顶点数
struct node{
int v, w;
int next;
}g[MAXM];

int head[MAXN], t;

void Init(){
t = 0;
memset(head, -1, sizeof(head));
}

void add(int u, int v, int w){
g[t].v = v;
g[t].w = w;
g[t].next = head[u];
head[u] = t;
t++;
}

int main(){
//freopen("d:\\my.txt", "r", stdin);
int n, m, i, j, u, v, w;
scanf("%d %d", &n, &m);
Init();

for(i=0; i<m; i++){
scanf("%d %d %d", &u, &v, &w);
add(u, v, w);
add(v, u, w);   //因为该图为无向图
}

for(i=1; i<=n; i++){
printf("与%d相关联的顶点有:\n", i);
for(j=head[i]; j != -1; j=g[j].next){
printf("%d ", g[j].v);
}
putchar('\n');
}

return 0;
}


邻接表(动态):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXN 100

struct node{
int v, w;
struct node *next;
}*head[MAXN];

void Init(){
memset(head, 0, sizeof(head));
}

void add(int u, int v, int w){
struct node *p = (struct node *)malloc(sizeof(struct node));
p->v = v;
p->w = w;
p->next = head[u];
head[u] = p;
}

int main(){
//freopen("d:\\my.txt", "r", stdin);
int n, m, i, u, v, w;
scanf("%d %d", &n, &m);
Init();
for(i=0; i<m; i++){
scanf("%d %d %d", &u, &v, &w);
add(u, v, w);
add(v, u, w);   //双向
}

for(i=1; i<=n; i++){
printf("与%d相关联的顶点有:\n", i);
struct node *p;
for(p=head[i]; p != NULL; p = p->next){
printf("%d ", p->v);
}
putchar('\n');
}

return 0;
}


邻接表(静态):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXN 100
#define MAXM 10000

struct node{
int v, w;
struct node *next;
}*head[MAXN];

struct node mem[MAXM];
int t;

void Init(){
t = 0;
memset(head, 0, sizeof(head));
}

void add(int u, int v, int w){
struct node *p = &mem[t++];
p->v = v;
p->w = w;
p->next = head[u];
head[u] = p;
}

int main(){
freopen("d:\\my.txt", "r", stdin);
int n, m, i, u, v, w;
scanf("%d %d", &n, &m);
Init();
for(i=0; i<m; i++){
scanf("%d %d %d", &u, &v, &w);
add(u, v, w);
add(v, u, w);   //双向
}
for(i=1; i<=n; i++){
printf("与%d相关联的顶点有:\n", i);
struct node *p;
for(p=head[i]; p != NULL; p = p->next){
printf("%d ", p->v);
}
putchar('\n');
}
return 0;
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: