请编写程序创建一个有向图。有向图中包含n个顶点,编号为0至n-1。
输入格式:
输入第一行为两个正整数n和e,分别表示图的顶点数和边数,其中n不超过20000,e不超过20000。接下来e行表示每条边的信息,每行为3个非负整数a、b、c,其中a和b表示该边的端点编号,c表示权值。各边并非按端点编号顺序排列。
输出格式:
按顶点编号递增顺序输出每个顶点引出的边,每个顶点占一行,若某顶点没有引出边,则不输出。每行表示一个顶点引出的所有边,格式为a:(a,b,w)……,表示有向边a->b的权值为w,a引出的多条边按编号b的递增序排列。
输入样例:
7 7
0 1 5
0 3 7
0 6 6
1 2 4
2 5 1
3 5 3
6 5 4
输出样例:
0:(0,1,5)(0,3,7)(0,6,6)
1:(1,2,4)
2:(2,5,1)
3:(3,5,3)
6:(6,5,4)
代码长度限制
16 KB
时间限制
500 ms
内存限制
20 MB
#include<bits/stdc++.h>
using namespace std;
//定义边的类Edge,包括起,终,权重
class Edge{
public:
int from,to,weight;
Edge(int from,int to,int weight){
this->from = from;
this->to = to;
this->weight = weight;
}
};
//定义图的类mymap
class mymap{
public:
int nv;
vector<vector<Edge>> v1; //vector容器内再装vector容器,边的集合
mymap(int n){
this->nv = n;
v1.resize(n); //初始化边集合,大小为顶点数
}
//插入边
void addedge(int from,int to,int weight){
v1[from].push_back(Edge(from,to,weight));
}
//打印图
void output(){
for(int i=0;i<nv;i++){
//响应题目的递增排序
sort(v1[i].begin(),v1[i].end(),[](Edge& a,Edge& b){return a.to<b.to;});
/*第一个参数是容器的起始迭代器,第二个参数是容器的结束迭代器,第三个参数是lambda表达式
lambda表达式中,用了比较函数,接收两个表示边Edge的参数a和b,比较其终点,进行从小到大的排序*/
if(v1[i].size()>0){//如果vector的大小不为零,则说明有边相连
cout<<i<<":";
for(auto& v2:v1[i]){
cout<<"("<<v2.from<<","<<v2.to<<","<<v2.weight<<")";
}
cout<<endl;
}
}
}
};
int main()
{
int n,m;
cin>>n>>m;
mymap m1(n);
for(int i=0;i<m;i++)
{
int from,to,weight;
cin>>from>>to>>weight;
m1.addedge(from,to,weight);
}
m1.output();
}
(新手发文,代码存在大量不足,仅供参考)