读书人

一路算法题不知错哪

发布时间: 2012-06-20 20:37:21 作者: rapoo

一道算法题,不知错哪
题目见http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1056

我用的是prim算法,参考http://www.cnblogs.com/bofengqiye/archive/2012/05/05/2484542.html

程序如下:

C/C++ code
#include <stdio.h>#define MAX 0x7fffffffint graph[110][110];void Initial(int schoolNum,int tunnelNum);void Prim(int schoolNum,int tunnelNum);int main(){    int schoolNum,tunnelNum;    scanf("%d%d",&schoolNum,&tunnelNum);    Initial(schoolNum,tunnelNum);    Prim(schoolNum,tunnelNum);    return 0;}void Initial(int schoolNum,int tunnelNum){    int src_schoolNo,des_schoolNo,interLength;    int i,j;    for (i=1;i<=schoolNum;i++)    {        for (j=1;j<=schoolNum;j++)        {            graph[i][j]=MAX;        }    }    for (i=1;i<=tunnelNum;i++)    {        scanf("%d%d%d",&src_schoolNo,&des_schoolNo,&interLength);        graph[src_schoolNo][des_schoolNo]=interLength;    }}void Prim(int schoolNum,int tunnelNum){    //TotalLength地道的总长度,TotalCost总花费,schoolConnNum地道能连接的学校数    int TotalLength=0,TotalCost,Min,minIndex,schoolConnNum=1;     //lowLength[i]不属于MST中的顶点i到MST中顶点的最小距离,isUsed表明学校是否属于地道,即是否在MST中    int lowLength[110],isUsed[110];     int i,j,cost[3];  //cost数组是三种币的个数    char *Unit[3]={"ac","ds","al"}; //Unit数组为三种币的单位    for (i=1;i<=schoolNum;i++) //地道起点为1号学校    {        lowLength[i]=graph[1][i];        isUsed[i]=0;    }    isUsed[1]=1;  //1号学校在MST中    for (i=1;i<schoolNum;i++)    {        Min=MAX;        minIndex=-1;        //找最短距离        for (j=1;j<=schoolNum;j++)        {            if (isUsed[j]==0&&lowLength[j]<Min)            {                minIndex=j;                Min=lowLength[j];            }        }        //找到        if (minIndex!=-1)        {            schoolConnNum++;            TotalLength+=Min;            isUsed[minIndex]=1;            for (j=1;j<=schoolNum;j++)  //更新数组            {                if (graph[minIndex][j]<lowLength[j])                {                    lowLength[j]=graph[minIndex][j];                }            }        }    }    if (schoolConnNum!=schoolNum) //最小生成树的节点数不等于学校总数,地道长度为0    {        TotalLength=0;    }    TotalCost=TotalLength*7;    i=0; //币种下标    cost[0]=TotalCost%29;    TotalCost/=29;    if (TotalCost)    {        cost[1]=TotalCost%17;        TotalCost/=17;        i++;        if (TotalCost)        {            cost[2]=TotalCost;            i++;        }    }    //输出    for (j=i;j>=0;j--)    {        printf("%d%s",cost[j],Unit[j]);    }    printf("\n");}


不管如何修改,都是:Wrong Answer at Test 3

求高手

[解决办法]
这是无向图,所以需要
graph[src_schoolNo][des_schoolNo]=graph[des_schoolNo][src_schoolNo]=interLength;

有向图的mst叫最小树形图,比prim/kruskal什么的复杂多了。

读书人网 >软件架构设计

热点推荐