您的位置:首页 > 其它

九度OJ 1545 奇怪的连通图

2013-11-27 15:02 204 查看
转载请注明出处:http://blog.csdn.net/a1dark

分析:其实就是一道kruskal的变形应用、先对边排序然后贪心、用并查集建最小生成树、然后判断1和N是否连通

#include<stdio.h>
#include<string.h>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
const int maxn=10005;
const int maxm=100005;
struct node{
int s,e,val;
}dot[maxm];
int mpt[maxn];
int n,m;
int cmp(node a,node b){
if(a.val<b.val)return 1;
return 0;
}
void init(){
for(int i=1;i<=n;i++){
mpt[i]=i;
}
}
int find(int x){
int r=x;
while(r!=mpt[r]){
r=mpt[r];
}
int b=x;
int f;
while(b!=r){
f=mpt[b];
mpt[b]=r;
b=f;
}
return r;
}
void merge(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx!=fy){
mpt[fx]=fy;
}
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<m;i++){
scanf("%d%d%d",&dot[i].s,&dot[i].e,&dot[i].val);
}
init();
sort(dot,dot+m,cmp);
int flag=0;
int ans;
for(int i=0;i<m;i++){
merge(dot[i].s,dot[i].e);
if(find(1)==find(n)){
ans=dot[i].val;
flag=1;break;
}
}
if(flag==0)printf("-1\n");
else{
printf("%d\n",ans);
}
}
return 0;
}

/**************************************************************
Problem: 1545
User: verticallimit
Language: C++
Result: Accepted
Time:680 ms
Memory:2232 kb
****************************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: