正文

stu(1185)2005-08-30 20:19:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/elva6401/4275.html

分享到:

# include<iostream.h>
int vexNum,arcNum;
long weight[100];
int arcs[100][100];
int dis[100][100];//dis[v][w]表示v到w的最少权值
long result[100][100];
int k;
long sum;
#define maxValue 32767

void init()
{
    int i,j;
    for(i=0;i<vexNum;i++)
        cin>>weight[i];
    for(i=0;i<100;i++)
        for(j=0;j<100;j++){
            if(i==j)
                arcs[i][j]=0;
            else
                arcs[i][j]=maxValue;
        }
    int v1,v2,w;
    for(i=0;i<arcNum;i++)
    {
        cin>>v1>>v2>>w;
        arcs[v1-1][v2-1]=w;
        arcs[v2-1][v1-1]=w;
    }
}

void shortestPath_floyd()//求每个点间的最短路径
{
    int i;
    for(i=0;i<vexNum;i++)
        for(int j=0;j<vexNum;j++)
             dis[i][j]=arcs[i][j];
    for(int k=0;k<vexNum;k++)//循环嵌套顺序不能调换,这样才相当于BFS
    {
        for(i=0;i<vexNum;i++)
        {
            for(int j=0;j<vexNum;j++)
            {
                if(dis[i][j]>dis[i][k]+dis[k][j])
                {
                    dis[i][j]=dis[i][k]+dis[k][j];
                    //如果i,j中间有di那么必须是i,k中有di或者k,j中有di
                }
            }
        }
    }
}
void min()
{
    int i,j;
    k=0;
    long sum1=0;
    for(j=0;j<vexNum;j++)
    {
        result[0][j]=dis[0][j]*weight[j];
        sum1+=result[0][j];
    }
    sum=sum1;
    for(i=0;i<vexNum;i++)
    {
       sum1=0;
       for(j=0;j<vexNum;j++)
       {
           result[i][j]=dis[i][j]*weight[j];
           sum1+=result[i][j];
       }
       if(sum1<sum)
        {
            sum=sum1;
            k=i;
       }
    }
}


        

int main()
{
    while(cin>>vexNum>>arcNum)
    {

    init();
    shortestPath_floyd();

    min();
    cout<<k+1<<" "<<sum<<endl;
    }
    return 0;
}

阅读(2043) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册