题目链接:点击打开链接
题意描述:给定一些点,在这些点之间建边使所有的点联通,要求在必须包含某条边的前提下边的权值之和最小?
解题思路:最小生成树问题prime(水题)
分析:我们将p、q两点的最短距离设为0,然后将p、q压入优先权队列中进行prime即可,记得最后加上p->q的权值即可
代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#define MAXN 60
using namespace std;
const double INF=1e9;
struct point{
int x,y;
}pi[MAXN];
double g[MAXN][MAXN];
int n,p,q;
double getdis(point a,point b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double dis[MAXN];
bool vis[MAXN];
struct node{
int x;
double dist;///错误二int
node(int _x,double _dist):x(_x),dist(_dist){}
bool operator<(const node& b)const{
return dist>b.dist;///错误一,符号反了
}
};
priority_queue<node> pq;
double Prime(){
double ans=g[p][q];
for(int i=1;i<