Friday, May 20, 2011

821 - Page Hopping


#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define M 100
using namespace std;

int NODE[M],LIST[M][M],adjNo[M];
int BFS(int);
int FindID(int,int);

int main()
{
    register int x,y,i,k=1,p,n,xid,yid;
    double avg;
    //freopen("in.txt","r",stdin);

    while(scanf("%d%d",&x,&y)&&(x|y))
    {
        n = 2;
        NODE[0] = x;
        NODE[1] = y;
        LIST[0][adjNo[0]++] = 1;

        while(scanf("%d%d",&x,&y)&&(x|y))
        {
            xid = FindID(x,n);
            yid = FindID(y,n);

            if(xid<0)xid = n++,NODE[xid] = x;
            if(yid<0)yid = n++,NODE[yid] = y;

            LIST[xid][adjNo[xid]++] = yid;
        }

        avg = 0;p = n*(n-1);
        for(i=0;i<n;i++)
            avg += BFS(i);
        avg /= p;
        printf("Case %d: average length between pages = %0.3lf clicks\n",k++,avg);
        memset(NODE,0,sizeof(NODE));
        memset(LIST,0,sizeof(LIST));
        memset(adjNo,0,sizeof(adjNo));
    }
    return 0;
}

int FindID(int node,int n)
{
    int i;
    for(i=0;i<n;i++)
        if(NODE[i] == node)
            return i;
    return -1;
}

int BFS(int s)
{
    int color[M],d[M],sum = 0;
    int i,x,h;
    queue<int>Q;

    memset(color,0,sizeof(color));
    color[s] = 1,d[s] = 0;
    Q.push(s);

    while(!Q.empty())
    {
        h = Q.front();
        Q.pop();

        for(i=0;i<adjNo[h];i++)
        {
            x = LIST[h][i];
            if(!color[x])
            {
                color[x] = 1;
                d[x] = d[h] + 1;
                sum += d[x];

                Q.push(x);
            }
        }
    }
    return sum;
}

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.