BUPT复试专题—网络传输(2014网研)

题目描述

网络的高效互联与智能传输是提升海量用户服务请求映射效率的重要措施。在这个任务中,你需耍在最小的传输时间内,将数据源传输到指定的网络节点中。
我们给定的网络一共包含N个节点,其中节点1为数据源。网络中有M条无向边(u,v,w),表示一条传输线连接节点u和节点v,且数据通过这条传输线的时间为 w。我们一共会给定K个目标节点,节点1只会发送一次数据,你要计算出该数据从节点1传送到所有K个节点所需耍的最短时间。目标节点可以按任意顺序进行传送,数据可以多次经过同一节点。
 

输入

输入数据第一行足一个整数T (T<= 5),表示测试数据的组数。
对于毎组测试数据:
第一行三个正整数N, M, K 
分别表示节点数,边数和目标节点数,
接下来M行,毎行三个数(u,v,w)如上所述给出毎条传输线。
M后一行是K个整数,给出所有的目标节点的编号。所有节点的编号都在 1到N之间。
 

输出

对于毎组测试数据,输出数据传送到所有K 标节点的最短时间。

样例输入

2
3 2 2
1 3 1
1 2 3
2 3
6 6 4
1 5 1
5 6 2
2 1 20
2 3 5
3 4 5
6 3 1
2 3 4 6

样例输出

5
19

提示

在第一组样例屮,最短路线是:1->3->1->2。

在第二组样例屮,最短路线是:1->5->6->3->2->3->4,或者1->5->6-> 3 -> 4 -> 3 -> 2

来源

2014网研D题 

思路是floyd + 全排列 交上去Runtime Error,没有发现问题有人发现问题的话求告知┭┮﹏┭┮

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define max 5000
#define INF 0x3f3f3f3f
int d[max][max],min_road=INF,now=0;
int V;
void floyd()
{
    for(int k=0;k<V;k++)
        for(int i=0;i<V;i++)
            for(int j=0;j<V;j++)
                d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
void permutation(char* pszStr,int k,int m)
{
    int i,j;
    if(k == m)
    {
        int lable,outprint=0,lb;
        for(int i=0;i<=m;i++)
        {
            lb=pszStr[i]-'0';
            if(lb==0)
                continue;
             outprint+=d[now][lb];
             now=lb;
        }
        if(outprint<min_road)
        {
             min_road=outprint;
        }
        now=0;
    }
    else
    {
        for(j=k;j<=m;j++)
        {
            swap(pszStr[j],pszStr[k]);
            permutation(pszStr,k+1,m);
            swap(pszStr[j],pszStr[k]);
        }
    }
}
int main()
{
    int a,nn,mm,kk,num;
    while(~scanf("%d",&a)) 
    {
        while(a--)
        {
            cin>>V>>mm>>kk;
            for(int i=0;i<V;i++)
            {
                for(int j=0;j<V;j++)
                {
                    if(i==j)
                        d[i][j]=0;
                    else
                        d[i][j]=INF;
                }
            }
            while(mm--)
            {
                int x,y,z;
                cin>>x>>y>>z;
                d[x-1][y-1]=z;
                d[y-1][x-1]=z;
            }
            floyd();
            char szTextStr[max];
            for(int j=0;j<kk;j++)
            {
                char t;
                cin>>t;
                szTextStr[j]=t-1;
            }
            szTextStr[kk]='';
            permutation(szTextStr,0,strlen(szTextStr)-1);//全排列算法 
            cout<<min_road<<endl;
            min_road=INF;
            now=0;
        }    
    }
    return 0;
}
原文地址:https://www.cnblogs.com/dzzy/p/8645532.html