图的存储

#include <iostream>

#include <cstdio>

#include <algorithm>

#include <vector>

using namespace std;

const int INF = 0x7fffffff;

const int maxn = 1100;

struct Edge {

    int from, to, dist;

};



vector<Edge> edges;

vector<int> G[maxn];//类似邻接表,保存着边的编号。



void init() {

   for(int i = 0; i < maxn; i++) G[i].clear();//节点从1开始编号。

   edges.clear();

}



void AddEdge(int from, int to, int dist) {

    int m;

    edges.push_back((Edge){from, to, dist});

    m = edges.size();//edges

    G[from].push_back(m-1);//给每个边编号从0开始。

}



void output(int u)

{

    for(int i = 0; i < (int)G[u].size(); i++) {

        Edge& e = edges[G[u][i]];//值得借鉴。

        printf("%d -> %d = %d\n", e.from, e.to, e.dist);

    }

}



int main()

{

    int n;

    while(scanf("%d", &n) != EOF) {//the number of the edges;

        init();

        for(int i = 0; i < n; i++) {//n个顶点,编号1 ~ n

            int from, to, dist;

            scanf("%d%d%d", &from, &to, &dist);

            AddEdge(from, to, dist);

            AddEdge(to, from, dist);

        }

        for(int i = 1; i <= n; i++) {

            output(i);

        }

    }

    return 0;

}



/****

6

1 2 2

1 4 3

2 4 4

2 3 5

3 4 6

3 5 7

****/


你可能感兴趣的:(存储)