【t058】拜年

Time Limit: 1 second
Memory Limit: 128 MB

【问题描述】

拜年是中国人少不了的风俗.还没过年呢,刚上小学的妮妮已经等不及要给她的小伙伴去拜年了,但是她不知道如何规划才会使自己走
的路最少.所以请叫您咯,她不想落下任何一位伙伴.为了走少花精力,她想走最少的路程去所有伙伴的家里.您将得到一份各伙伴
家路程的列表,您必须找出能走最少路程去所有小伙伴家的最少路程.
补充:
妮妮是从1号节点开始走的;
妮妮可以在任意的时刻瞬移到之前走过的节点;(还没走过的不行);
(总之,这道题就是想让你从1号节点开始跑一遍普利姆算法)
(题目样例给你一种假象,这是一张无向图,但其实是有向图…,给的测试样例里面没有一个是无向图,全都和样例不一样…,即w[x][y]=w[y][x]不一定成立)

【输入格式】

输入文件第一行为妮妮小伙伴的个数,n(3<=n<=100)
下面是一个n*n的矩阵,表示每个小伙伴家的距离d(d<=100000),可以保证所有小伙伴都相互认识。

【输出格式】

只有一个输出为要去所有小伙伴家要走的最少路程

Sample Input

4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0

Sample Output

28

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t058

【题解】

很糟糕的题.
补充:
妮妮是从1号节点开始走的;
妮妮可以在任意的时刻瞬移到之前走过的节点;(还没走过的不行);
(题目样例给你一种假象,这是一张无向图,但其实是有向图…,给的测试样例里面没有一个是无向图,全都和样例不一样…,即w[x][y]=w[y][x]不一定成立)
(总之,这道题就是想让你从1号节点开始跑一遍普利姆算法)
这种题就当练手吧。别想了;

【完整代码】

#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
#define rei(x) scanf("%d",&x)
#define rep1(i,x,y) for (int i = x;i <= y;i++)

const int MAXN = 100+10;
int n,w[MAXN][MAXN],dis[MAXN];
bool bo[MAXN];

int main()
{
    //freopen("F:\rush.txt","r",stdin);
    rei(n);
    rep1(i,1,n)
        rep1(j,1,n)
            rei(w[i][j]);
    rep1(i,1,n)
        dis[i] = 21e8;
    dis[1] = 0;
    while (true)
    {
        int mi = 21e8,j = -1;
        rep1(i,1,n)
            if (dis[i]<mi && !bo[i])
            {
                mi = dis[i];
                j = i;
            }
        if (j==-1)
            break;
        bo[j] = true;
        rep1(i,1,n)
            if (!bo[i] && w[j][i]>0 && w[j][i]<dis[i])
                dis[i] = w[j][i];
    }
    int ans = 0;
    rep1(i,1,n)
        ans += dis[i];
    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7626688.html