邻接表保存图

来源:互联网 发布:易烊千玺水平知乎 编辑:程序博客网 时间:2024/05/21 20:28

先来一张图表示下大概的保存形式:


如同上图:下面代码给出详细的解释,代码是根据HDU2376写的:

#include<stdio.h>#include<iostream>#include<string.h>using namespace std;#define maxn 10010struct Node{    int v,next,value;//v是结点,next是记录与i相连的下一个节点所在边的下标} edge[maxn*2+10];  //记录边int head[maxn]; //head[i]的i是头节点,head[i]记录的是与i相连的结点的下一条边double ans[maxn];int sum[maxn];int kk;int ss;int n;void add(int fa,int son,int value){    edge[kk].v=son; //记录新边    edge[kk].value=value;    edge[kk].next=head[fa];//增加结点,新边的next是上一条边的下标    head[fa]=kk++;//更新head[fa]的指向,并且总边数++}void dfs(int root,int fa){    sum[root]=1;    for(int i=head[root];i!=-1;i=edge[i].next)    {        int son=edge[i].v;        if(son==fa)            continue;        dfs(son,root);        sum[root]+=sum[son];        ans[root]+=ans[son]+(double)sum[son]*(n-sum[son])*edge[i].value;    }}int main(){    int t;    scanf("%d",&t);    while(t--)    {        memset(head,-1,sizeof(head));        memset(ans,0,sizeof(ans));        scanf("%d",&n);        kk=1;        int a,b,c;        for(int i=0; i<n-1; i++)        {            scanf("%d%d%d",&a,&b,&c);            add(a,b,c);            add(b,a,c);        }        dfs(0,-1);        ss=n*(n-1)/2;        printf("%llf\n",(double)ans[0] / ss);    }    return 0;}


0 0