BZOJ1083 SCOI2005 繁忙的都市 最小生成树

#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <functional>
using namespace std;

const int MAXN=1000+2;
struct NODE{
int u,w;
NODE(){}
NODE(int _u,int _w):u(_u),w(_w){}
friend bool operator <(NODE a,NODE b){ return a.w>b.w;}
};
int N,graph[MAXN][MAXN],b,dist[MAXN],e,M,ans=-1;
bool visited[MAXN];
priority_queue<NODE> s;

int Prim(int b){
memset(dist,0X7F,sizeof(dist));
memset(visited,0,sizeof(visited));
dist[b]=0;

NODE tmp=NODE(b,0),t;
s.push(tmp);

while(!s.empty()){
tmp=s.top();
s.pop();

if(visited[tmp.u]) continue;
visited[tmp.u]=1,ans=max(tmp.w,ans);

for(int i=1;i<=N;i++)
if(dist[i]>graph[tmp.u][i]){
dist[i]=graph[tmp.u][i];
t.w=dist[i],t.u=i;
s.push(t);
}
}
}

int main(){
cin >> N >> M;
for(int i=1,u,v,c;i<=M;i++){
cin >> u >> v >> c;
if(graph[u][v]) graph[u][v]=graph[v][u]=min(graph[v][u],c);
else graph[u][v]=graph[v][u]=c;
}

for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
if(!graph[i][j]) graph[i][j]=graph[j][i]=INT_MAX;

Prim(1);

cout << N-1 << " " << ans << endl;

return 0;
}
View Code

posted @ 2017-02-28 01:14  WDZRMPCBIT  阅读(97)  评论(0编辑  收藏