邻接表

数据大时矩阵不够 这时用邻接表;

 


指针类型的邻接表

 1 /*邻接表*/
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<iostream>
 5 struct arcnode//边结点
 6 {
 7     int vertex;//与表头定点相邻的顶点编号
 8     int weight;//边的权值
 9     arcnode *next;//指向下一条边
10 };
11 struct vernode//顶点结点
12 {
13     int vex;//顶点编号
14     arcnode *firarc;//
15 }ver[1000];
16 int n;
17 void inint()
18 {
19     int i;
20     for(i=1;i<=n;i++)
21     {
22         ver[i].vex=i;
23         ver[i].firarc=NULL;
24     }
25 }
26 void add(int x,int y,int z)
27 {
28     int i,j;
29     arcnode *p;
30     p=new arcnode();
31     p->vertex=y;
32     p->weight=z;
33     p->next=NULL;
34     if(ver[x].firarc==NULL)
35     {
36         ver[x].firarc=p;
37     }
38     else 
39     {
40         while(ver[x].firarc->next!=NULL)
41         {
42             if(ver[x].firarc->vertex==y)//检查有重复
43             {
44                 if(ver[x].firarc->weight>z)
45                     ver[x].firarc->weight=z;
46                 return;
47             }
48             ver[x].firarc=ver[x].firarc->next;
49         }
50         ver[x].firarc->next=p;
51         return;
52     }
53 }
54 int main()
55 {
56     int i,j;
57     scanf("%d",&n);
58     inint();
59     for(i=1;i<=6;i++)
60     {
61         int x,y,z;
62         scanf("%d%d%d",&x,&y,&z);
63         add(x,y,z);
64         add(y,x,z);
65     }
66 }

/*
就是一副画 然后就很好懂了
@1->#->#->null
@2->#->#->#->null
@3->#->null
类似如此的画
*/

 1 /*******--------*******/
 2 /*静态邻接表*/
 3 
 4 #include<stdio.h>
 5 #include<string.h>
 6 struct node
 7 {
 8     int v;//后面点
 9     int w;//
10     int next;//记录同一起点的下一条边的位置
11 }edge[200005];
12 
13 int n,m,dis[53003];//dis[]放长度
14 int vis[53003];//标记
15 
16 int index;//表示位置
17 
18 int pre[53003];//开始的顶点
19 
20 void add(int x,int y,int z)
21 {
22     edge[index].v=y;//后面那个点
23     edge[index].w=z;//edge[].w表示权值
24     edge[index].next=pre[x];//保存x起点的上一条边在edge数组中的位置
25     pre[x]=index++;//更新
26     //以下为无向图
27     /*edge[index].v=x;
28     edge[index].w=z;
29     edge[index].next=pre[y];
30     pre[y]=index++;*/
31     
32 }
33 
34 struct Node
35 {
36     int point,dist;
37     bool operator<(const Node x) const //优先队列的自定义(这里最小的,可以发现大小号)
38     {
39         return x.dist<dist;
40     }
41 };
42 int main()
43 {
44     int i,j,t;
45     scanf("%d",&t);
46     while(t--)
47     {
48         scanf("%d %d",&n,&m);
49         index=1;
50         memset(vis,0,sizeof(vis));
51         memset(pre,-1,sizeof(pre));
52         for(i=0;i<m;i++)
53         {
54             int x,y,z;
55             scanf("%d %d %d",&x,&y,&z);
56             if(x==y)continue;
57             add(x,y,z);
58         }
59     }
60 }

 

posted @ 2015-05-05 09:01  sweat123  阅读(161)  评论(0编辑  收藏  举报