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;
}