手打的建图模板
因为本人太懒,甚至懒得用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的权值。如果两点不直接连接,则返回 。
//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个下家的权值。如果两点不直接连接,则返回 。
🔔 结点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