题解:求最小生成树的最大权值边
①n<=50000,用二维数组会编译出错,开不了50000*50000这么大的数组
②用Vector+优先队列 优化Prim即可得正解,一定要用优先队列优化,否则会超时!
③可以用struct Node,也可以用Pair优化
#include <stdio.h> #include <string.h> #include <algorithm> #include <vector> #include <queue> #define MAX 50005 #define INF 0x3f3f3f3f using namespace std; typedef struct Node{ int v; //边的顶点 int w; //权值 }Node; struct cmp{ //重载Node的比较运算符 bool operator()(Node a,Node b){ return a.w>b.w; } }; vector<Node> map[MAX]; priority_queue <Node, vector<Node>, cmp >q; //用优先队列优化 int vis[MAX]; //是否被访问过 int dis[MAX]; //该集合到所有点的最短距离 int max_dis; int n,m; void prim(){ memset(dis,INF,sizeof(dis)); memset(vis,0,sizeof(vis)); dis[1]=0; max_dis; int min_,k; Node node1; node1.v=1; node1.w=0; q.push(node1); while(!q.empty()){ //依次加入每一个顶点 Node node=q.top(); q.pop(); int v=node.v; int w=node.w; vis[v]=1; if(dis[v] > max_dis) max_dis=dis[v]; for(int j=0;j<map[v].size();j++){ //更新与v点相邻的点v到集合V'的最短距离 int v_=map[v][j].v; int w_=map[v][j].w; if(!vis[v_]){ if(dis[v_]>w_){ //点v没有被访问过且点v到点k的距离小于点v到集合V'的距离 dis[v_]=w_; Node node_; node_.v=v_; node_.w=w_; q.push(node_); } } } } } int main(){ int root; int u,v,w; while(scanf("%d",&n)!=EOF){ scanf("%d",&m); scanf("%d",&root); for(int i=1;i<=n;i++) map[i].clear(); for(int i=0;i<m;i++){ scanf("%d %d %d",&u,&v,&w); Node node1,node2; node1.v=v; node1.w=w; map[u].push_back(node1); node2.v=u; node2.w=w; map[v].push_back(node2); } prim(); printf("%d\n",max_dis); } return 0; }