#include<bits/stdc++.h>usingnamespace std;constint NR =1e2;classGraph{public:int mp[NR +10][NR +10];int n, m;//点的个数, 边的个数;Graph(){memset(mp,~0x3f3f3f3f,sizeof(mp));}voidadd(int x,int y,int z){
mp[x][y]= z;//mp[y][x] = z;return;}voidread(){scanf("%d%d",&n,&m);for(int i =1;i <= m;i++){int a, b, c;scanf("%d%d%d",&a,&b,&c);add(a, b, c);}return;}intergodic(){int cnt =0;for(int i =1;i <= n;i++){for(int j =1;j <= n;j++){if(mp[i][j]>0){
cnt++;printf("%d -> %d = %d\n", i, j, mp[i][j]);}}}
m = cnt;return cnt;}};intmain(){
Graph g;
g.read();printf("%d\n", g.ergodic());int x, y, z;scanf("%d%d%d",&x,&y,&z);
g.add(x, y, z);printf("%d\n", g.ergodic());return0;}
2
2
2 链式前向星 :
#include<bits/stdc++.h>usingnamespace std;constint NR =1e5;structEdge{int v, w;//这条边到达的点, 这条边的长度;int nxt;//下一条边的编号;};classGraph{public:
Edge edge[NR +10];//所有的边;int adj[NR +10]={0};//每个节点相连的最后一条边在edge[m]中的下标;int n, m;//点的个数, 边的个数;Graph(int x){
n = x;
m =0;memset(adj,~0x3f3f3f3f,sizeof(adj));}voidadd(int x,int y,int z){
m++;
edge[m].nxt = adj[x];
edge[m].v = y;
edge[m].w = z;
adj[x]= m;return;}voidread(){int a, b, c;while(scanf("%d%d%d",&a,&b,&c)==3){add(a, b, c);//add(b, a, c);}return;}intergodic(){int cnt =0;for(int i =1;i <= n;i++){int tmp = adj[i];while(tmp >0){
cnt++;printf("%d -> %d = %d\n", i, edge[tmp].v, edge[tmp].w);
tmp = edge[tmp].nxt;}}
m = cnt;return cnt;}};intmain(){int n;scanf("%d",&n);
Graph g(n);
g.read();printf("%d\n", g.ergodic());int x, y, z;scanf("%d%d%d",&x,&y,&z);
g.add(x, y, z); g.add(y, x, z);printf("%d\n", g.ergodic());return0;}
3
3
3 链表 :
#include<bits/stdc++.h>usingnamespace std;constint NR =1e5;typedefstructEdge* Gra;structEdge{int v, w;structEdge*nxt;};classGraph{public:
Gra adj[NR +10];int n, m;//点的个数, 边的个数;Graph(int x,int y){
n = x, m = y;for(int i =1;i <= n;i++){
adj[i]=new Edge;
adj[i]->v = i;
adj[i]->w =-0x3f3f3f3f;
adj[i]->nxt =nullptr;}return;}voidadd(int x,int y,int z){
Gra pos, nw =new Edge;if(nw){
nw->v = z;
nw->nxt =nullptr;
nw->w = y;
pos = adj[x];while(pos->nxt){
pos = pos->nxt;}
pos->nxt = nw;}return;}voidread(){for(int i =1;i <= m;i++){int a, b, c;scanf("%d%d%d",&a,&b,&c);add(a, b, c);//add(b, a, c);}return;}intergodic(){int cnt =0;for(int i =1;i <= n;i++){for(Gra u = adj[i]->nxt;u;u = u->nxt){printf("%d -> %d\n", i, u->w);
cnt++;}}
m = cnt;return cnt;}};intmain(){int n, m;scanf("%d%d",&n,&m);
Graph g(n, m);
g.read();printf("%d\n", g.ergodic());int x, y, z;scanf("%d%d%d",&x,&y,&z);
g.add(x, y, z);printf("%d\n", g.ergodic());return0;}
4
4
4 边目录vector实现 :
#include<bits/stdc++.h>usingnamespace std;constint NR =1e3;classGraph{public:int u[NR +10], v[NR +10], w[NR +10];int nxt[NR +10];// nxt[i] = i 的下一条边的序号
vector<int> adj[NR +10];//每个节点相连的最后一条边在edge[m]中的下标;int n, m;//点的个数, 边的个数;Graph(int x){
n = x;
m =0;}voidadd(int x,int y,int z){
m++;
u[m]= x;
v[m]= y;
w[m]= z;
adj[x].emplace_back(m);return;}voidread(){int a, b, c;while(scanf("%d%d%d",&a,&b,&c)==3){add(a, b, c);//add(b, a, c);}return;}intergodic(){int cnt =0;for(int i =1;i <= n;i++){for(auto it : adj[i]){printf("%d -> %d = %d\n", i, v[it], w[it]);
cnt++;}}
m = cnt;return cnt;}};intmain(){int n;scanf("%d",&n);
Graph g(n);
g.read();printf("%d\n", g.ergodic());int x, y, z;scanf("%d%d%d",&x,&y,&z);
g.add(x, y, z); g.add(y, x, z);printf("%d\n", g.ergodic());return0;}
5
5
5 边结构体vector实现 :
#include<bits/stdc++.h>usingnamespace std;constint NR =1e3;structEdge{int u, w;};classGraph{public:
vector<Edge> adj[NR +10];//以 i 为起点的所有边int n, m;//点的个数, 边的个数;Graph(int x,int y){
n = x;
m = y;}voidadd(int x,int y,int z){
adj[x].emplace_back(Edge{y, z});return;}voidread(){for(int i =1;i <= m;i++){int a, b, c;scanf("%d%d%d",&a,&b,&c);add(a, b, c);//add(b, a, c);}return;}intergodic(){int cnt =0;for(int i =1;i <= n;i++){for(auto it : adj[i]){printf("%d -> %d = %d\n", i, it.u, it.w);
cnt++;}}
m = cnt;return cnt;}};intmain(){int n, m;scanf("%d%d",&n,&m);
Graph g(n, m);
g.read();printf("%d\n", g.ergodic());int x, y, z;scanf("%d%d%d",&x,&y,&z);
g.add(x, y, z); g.add(y, x, z);printf("%d\n", g.ergodic());return0;}