功能:圖論中存儲點,邊和遍歷查找;
介紹:edge[i].w 第i條邊的權重
edge[i].to 第i條邊的終點
edge[i].next 與第i條邊同起點的上一條邊的存儲位置
head[i] 以i爲起點的第一條邊的存儲位置
1. 添加點邊數據
#define maxn 10005
int head[maxn];
struct _edge_//定義結構體數組edge[]存儲邊的各項信息
{
int w;
int u,
int v;
}edge[maxn];
int cnt=0;//cnt初始化爲0
memset(head,-1,sizeof(head));//head[]初始化爲-1
void add(int u,int v,int w) //函數add可以添加數據
{
edge[cnt].w=w;
edge[cnt].to=v;
edge[cnt].next=head[u];//上一條以u爲起點的邊的存儲位置 如果前面沒有以u爲起點的邊則使它等於-1
head[u]=cnt++;//當前以u爲起點的邊的存儲位置
}
下面舉個例子 有助於理解 (爲了儘量好理解 我們省去權重這一項)
邊信息 cnt edge[cnt].to edge[cnt].next u head[u]
(1,2) 0 2 -1 1 0
(2,3) 1 3 -1 2 1
(3,4) 2 4 -1 3 2
(1,3) 3 3 0 1 3
(4,1) 4 1 -1 4 4
(1,5) 5 5 3 1 5
(4,5) 6 5 4 4 6
int from=u;//起點爲u</span>
for(int i=head[u];i!=-1;i=edge[i].next)//先找到第一個以u爲起點的存儲位置
{ //再令i爲上一條以u爲起點的存儲位置
to=edge[i].to; //直到i==-1則之前沒有以u爲起點的邊
w=edge[i].w;
}
現在讓我們開始查找以某個點爲起點的邊
借上例 我們來查找以1爲起點的邊
首先i=head[1]=5;得到最後一個以1爲起點的邊的存儲位置
然後我們就在edge[5]裏面找到這條邊所有的信息了
下面訪問edge[5].next 該值爲3 得到上一條以1爲起點的邊的存儲位置
同理我們可以在edge[3]中找到該邊所有的信息了
在接下來訪問edge[3].next 該值爲0 再得到更上面一條以1爲起點的邊的存儲位置
再同理我們可以在edge[0]中找到該邊所有的信息了
下面訪問edge[0].next==-1;結束
可能文字比較難於理解 下面來爲便於理解一發流程圖
u=1--->head[1]=5------>edge[5]------->edge[5].next=3----->edge[3]----->edge[3].next=0------->edge[0]
起點 第一個位置 邊的信息 上一條邊的存儲位置 邊的信息 再上一條邊的存儲位置 邊的信息
---->edge[0].next=-1
結束
欲知更多相見ACdream的blog 附帶傳送門
http://blog.csdn.net/acdreamers/article/details/16902023