因为本人太懒,甚至懒得用vector建图😅,所以我就用OI邪教DILL的书中的知识写了一个很简单但能满足日常建图需要的模板。

代码:

class graph
{
	private:
		struct edge
		{
			int y,w;
		};
		vector<edge>e[1001];
		const int INF=1000000001;
		int n,m,indg[1001];
	public:
		graph(int dn,int dm)
		{
			n=dn;
			m=dm;
		}
		void newedge(int x,int y,int w)
		{
			edge t;
			t.y=y;
			t.w=w;
			indg[y]++;
			e[x].push_back(t);
			return;
		}
		int outdegree(int x)
		{
			return e[x].size();
		}
		int indegree(int x)
		{
			return indg[x];
		}
		int edgelen(int x,int y)
		{
			for(int i=0;i<e[x].size();i++)
			{
				if(e[x][i].y==y) return e[x][i].w;
			}
			return INF;
		}
		int edgelen_index(int x,int y)
		{
			return e[x][y].w;
		}
};

介绍一下其中的功能:

构造graph

使用graph(int n,int m)来创建一个graph。
这个graph可以有负权,但不能有重边
n代表图的点数,m代表图的边数,当然,您也可以不填,但有些函数无法使用。

//Example1
graph A; 
graph B(4,5); 

增边

使用newedge(int x,int y,int w)可以新增一条从x到y,权值为w的边。

//Example2
graph g;
g.newedge(1,2,1);
g.newedge(2,3,1);

查询结点入度/出度

使用indegree(int x)来查询结点x的入度。
使用outdegree(int x)来查询结点x的出度。

//Example3
graph g;
g.newedge(1,2,1);
g.newedge(2,3,1);
printf("%d %d",g.indegree(2),g.outdegree(2));

输出:

1 1

查询两直接相连结点之间的度数(方案一)

使用edgelen(int x,int y)来查询结点x到结点y的权值。如果两点不直接连接,则返回 109+110^9+1

//Example4
graph g;
g.newedge(1,2,1);
g.newedge(2,3,1);
printf("%d %d",g.edgelen(1,2),g.edgelen(1,3));

输出:

1 1000000001

查询两直接相连结点之间的度数(方案二)

使用edgelen_index(int x,int y)来查询结点x到结点x的第y个下家的权值。如果两点不直接连接,则返回 109+110^9+1

🔔 结点x的第y个下家是指此结点与结点x增边时结点x已经与(y-1)个点连接。

//Example4
graph g;
g.newedge(1,2,1);
g.newedge(1,3,2);
g.newedge(2,3,1);
printf("%d %d",g.edgelen_index(1,1),g.edgelen_index(1,2));

输出:

1 2