当前位置:编程学习 > C/C++ >>

池子法 邻接表建图

[cpp] 
#include <stdio.h> 
#include <cstring> 
#define maxn 1000 
struct edge 

    int from,to,next,val; 
} e[maxn]; 
int first[maxn]; 
int main() 

    int n; 
    while(scanf("%d",&n)==1) 
    { 
        memset(first,-1,sizeof(first)); 
        for(int i=0; i<n; i++) 
        { 
            scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].val); 
            e[i].next=first[e[i].from]; 
            first[e[i].from]=i; 
        } 
        for(int i=1; i<10; i++) 
        { 
            printf("以%d为起点的边是:\n",i); 
            for(int u=first[i];u!=-1;u=e[u].next) 
            printf("%d %d %d\n",e[u].from,e[u].to,e[u].val); 
        } 
    } 
    return 0; 

 
一下为转载、、 
#include<iostream> 
  #define Maxn 200 
  using namespace std; 
  struct edge{int from,to,weight,next;}e[Maxn];//存储边信息的结构体  
#include <stdio.h> 
#include <cstring> 
#define maxn 1000 
struct edge 

    int from,to,next,val; 
} e[maxn]; 
int first[maxn]; 
int main() 

    int n; 
    while(scanf("%d",&n)==1) 
    { 
        memset(first,-1,sizeof(first)); 
        for(int i=0; i<n; i++) 
        { 
            scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].val); 
            e[i].next=first[e[i].from]; 
            first[e[i].from]=i; 
        } 
        for(int i=1; i<10; i++) 
        { 
            printf("以%d为起点的边是:\n",i); 
            for(int u=first[i];u!=-1;u=e[u].next) 
            printf("%d %d %d\n",e[u].from,e[u].to,e[u].val); 
        } 
    } 
    return 0; 

 
一下为转载、、 
#include<iostream> 
  #define Maxn 200 
  using namespace std; 
  struct edge{int from,to,weight,next;}e[Maxn];//存储边信息的结构体  
 int first[Maxn];//起点为下标存储(e中边的位置)  
 int main() 
 { 
     int edges;//边数  
     memset(first,-1,sizeof(first)); 
     //因为刚开始first不指向任何一条边的下标,所以first都为-1  
     cin>>edges;//边数  
     for(int i=0;i<edges;i++) 
     { 
         cin>>e[i].from>>e[i].to>>e[i].weight;//起点 终点 权重  
         e[i].next=first[e[i].from];first[e[i].from]=i;//不容易理解的地方 
         /*
         利用first数组存储的是最新的(以数组下标为起点的)边的下标 
         并且该条边的next指向的是同样以数组下标为起点的下一条边的下标 
         直到下一条边的next=-1(即将所有以数组下标为起点的边都遍历了一遍) 
         */ 
     } 
     for(int u=1;u<10;u++)//输出图  
     { 
         cout<<"以"<<u<<"为起点的所有边的信息:"<<endl;  
         for(int v=first[u];v!=-1;v=e[v].next)//遍历以u为起点的所有边的信息  
             cout<<e[v].from<<" "<<e[v].to<<" "<<e[v].weight<<endl; 
     } 
     return 0; 
 } 
 /*
 5
 3 4 6
 3 7 8
 1 3 6
 2 4 7
 3 5 1
 */</span> 
 
 
 int first[Maxn];//起点为下标存储(e中边的位置)  
 int main() 
 { 
     int edges;//边数  
     memset(first,-1,sizeof(first)); 
     //因为刚开始first不指向任何一条边的下标,所以first都为-1  
     cin>>edges;//边数  
     for(int i=0;i<edges;i++) 
     { 
         cin>>e[i].from>>e[i].to>>e[i].weight;//起点 终点 权重  
         e[i].next=first[e[i].from];first[e[i].from]=i;//不容易理解的地方 
         /*
         利用first数组存储的是最新的(以数组下标为起点的)边的下标 
         并且该条边的next指向的是同样以数组下标为起点的下一条边的下标 
         直到下一条边的next=-1(即将所有以数组下标为起点的边都遍历了一遍) 
         */ 
     } 
     for(int u=1;u<10;u++)//输出图  
     { 
         cout<<"以"<<u<<"为起点的所有边的信息:"<<endl;  
         for(int v=first[u];v!=-1;v=e[v].next)//遍历以u为起点的所有边的信息  
             cout<<e[v].from<<" "<<e[v].to<
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,