方法一:邻接矩阵建图
#include<bits/stdc++.h>
#define Max 100
using namespace std;
struct node{
int v;//顶点数
int e;//边数
int G[Max][Max];
int Data[Max];//存顶点的数据
};
struct Enode{
int v1,v2;//有向边
int w;//权重
};
node *creat(int V);//初始化一个有顶点无边的图
void In(node *p,Enode *E);//向node中插入边
int main()
{
int v,e;
node *p;
cin>>v;
p=creat(v);
cin>>p->e;
if(p->e!=0)
{
Enode *E=(Enode*)malloc(sizeof(Enode));
for(int i=0;i<p->e;i++)
{
cin>>E->v1>>E->v2>>E->w;
In(p,E);
}
}
//如果顶点有数据的话读入数据
for(int i=0;i<v;i++)
cin>>p->Data[i];
for(int i=0;i<p->v;i++)
{
for(int j=0;j<p->v;j++)
cout<<i<<"->"<<j<<"的权重 "<<p->G[i][j]<<" ";
cout<<endl;
}
for(int i=0;i<p->v;i++)
cout<<"顶点"<<i<<"的数据 "<<p->Data[i]<<endl;
return 0;
}
node *creat(int V)
{
node *p=(node*)malloc(sizeof(node));
p->v=V;
p->e=0;
for(int i=0;i<p->v;i++)
for(int j=0;j<p->v;j++)
{
p->G[i][j]=0;
}
return p;
}
void In(node *p,Enode *E)
{
p->G[E->v1][E->v2]=E->w;
p->G[E->v2][E->v1]=E->w;
}
方法二 :邻接矩阵的简写版
#include<bits/stdc++.h>
#define Max 100
using namespace std;
int G[Max][Max];
int main()
{
int v;
cin>>v;
for(int i=0;i<v;i++)
for(int j=0;j<v;j++)
{
G[i][j]=0;
}
int e;
cin>>e;
int v1,v2,w;
for(int i=0;i<e;i++)
{
cin>>v1>>v2>>w;
G[v1][v2]=w;
G[v2][v2]=w;
}
return 0;
}
方法三:邻接表建图
方法三:邻接表建图
无向无权图
#include <bits/stdc++.h>
using namespace std;
vector<int> v[N];
const int N = 1e5;
int main()
{
int n, m;
cin>>n>>m;
int s, t;
for(int i = 0;i < m; i++) {
cin>>s>>t;
v[s].push_back(t);
v[t].push_back(s);
}
for(int i = 1; i< n; i++) {
for(int j = 0;j < v[i].size(); j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
return 0;
}
有向无全图
#include <bits/stdc++.h>
using namespace std;
vector<int> v[N];
const int N = 1e5;
int main()
{
int n, m;
cin>>n>>m;
int s, t;
for(int i = 0;i < m; i++) {
cin>>s>>t;
v[s].push_back(t);
}
for(int i = 1; i< n; i++) {
for(int j = 0;j < v[i].size(); j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
return 0;
}
有向有权图
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
struct Edge{
int to;
int cost;
};
vector <Edge> G[10000];//G[i]代表从i出发的边,vector里存的是to const
int m,n;
int temp1;
int main()
{
scanf("%d%d",&n,&m);//结点数,边数,从0开始
while(m--)
{
Edge e;
scanf("%d%d%d",&temp1,&e.to,&e.cost);
G[temp1].push_back(e);
}
for(int i=0;i<=n;i++)//遍历从每个节点出发的所有边
{
for(int j=0;j<G[i].size();j++)//G[i].size()为以i点出发的边的条数
{
Edge e=G[i][j];
printf("From %d to %d, the cost is %d\n",i,G[i][j].to,G[i][j].cost);
}
}
return 0;
}
用数组模拟邻接表存储
#include<bits/stdc++.h>
using namespace std;
struct node
{
int next;//下一条边的编号
int to;//这条边到达的点
int dis;//这条边的长度
}edge[1001];
int head[1001];
int num_edge;
int n,m;
void add_edge(int from,int to,int dis)//加入一条从from到to距离为dis的单向边
{
edge[++num_edge].next=head[from];
edge[num_edge].to=to;
edge[num_edge].dis=dis;
head[from]=num_edge;
}
int main()
{
num_edge=0;
cin>>n>>m;
for(int i=1;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
add_edge(a,b,c);
}
for(int i=head[1];i!=0;i=edge[i].next){//遍历从点1开始的所有边
cout<<edge[i].next<<" "<<edge[i].to<<" "<<edge[i].dis<<endl;
}
return 0;
}