最小生成树 ,并查集
用的是kruskal算法,第一次用 ,其实挺简单的
qwertyxk | 1861 | Accepted | 420K | 94MS | C++ | 1267B |
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define MAX 15000
typedef struct
{
int first;
int second;
int cablelen;
bool choosed;
}connect;
connect connections[MAX+10];
int hubs[1010];
bool compare(connect a,connect b)
{
return a.cablelen<b.cablelen;
}
int find(int i)
{
for(;hubs[i]>=0;i=hubs[i])
{;}
return i;
}
void simpleUnion(int i,int j)
{
hubs[i]=j;
}
int main()
{
int N,M,i,count=0,count1=0,maxnum=0;
scanf("%d%d",&N,&M);
for(i=1;i<=N;i++)
hubs[i]=-1;
for(i=0;i<M;i++)
{
scanf("%d%d%d",&connections[i].first,&connections[i].second,&connections[i].cablelen);
connections[i].choosed=false;
}
sort(connections,connections+M,compare); \\路径从小到大排序
while(count!=N-1)
{
while(count1<=M-1)
{
int a=find(connections[count1].first);
int b=find(connections[count1].second);
count1++;
if(a!=b)
{
simpleUnion(a,b);
count++;
connections[count1-1].choosed=true;
if(connections[count1-1].cablelen>maxnum)
maxnum=connections[count1-1].cablelen;
break;
}
}
}
printf("%d\n",maxnum);
printf("%d\n",N-1 );
for(i=0;i<M;i++)
if(connections[i].choosed)
printf("%d %d\n",connections[i].first,connections[i].second);
system("pause");
return 0;
}
在这里提一个很性感、犀利的编辑器 sublime text2
写代码非常方便,在这里存一下一些快捷操作
Ctrl+L | 选择整行(按住-继续选择下行) |
Ctrl+KK | 从光标处删除至行尾 |
Ctrl+Shift+K | 删除整行 |
Ctrl+Shift+D | 复制光标所在整行,插入在该行之前 |
Ctrl+J | 合并行(已选择需要合并的多行时) |
Ctrl+KU | 改为大写 |
Ctrl+KL | 改为小写 |
Ctrl+D | 选词(按住-继续选择下个相同的字符串) |
Ctrl+M | 光标移动至括号内开始或结束的位置 |
Ctrl+Shift+M | 选择括号内的内容(按住-继续选择父括号) |
Ctrl+/ | 注释整行(如已选择内容,同“Ctrl+Shift+/”效果) |
Ctrl+Shift+/ | 注释已选择内容 |
Ctrl+Space | 自动完成(win与系统快捷键冲突,需修改) |
Ctrl+Z | 撤销 |
Ctrl+Y | 恢复撤销 |
Ctrl+Shift+V | 粘贴并自动缩进(其它兄弟写的,实测win系统自动缩进无效) |
Ctrl+M | 光标跳至对应的括号 |
Alt+. | 闭合当前标签 |
Ctrl+Shift+A | 选择光标位置父标签对儿 |
Ctrl+Shift+[ | 折叠代码 |
Ctrl+Shift+] | 展开代码 |
Ctrl+KT | 折叠属性 |
Ctrl+K0 | 展开所有 |
Ctrl+U | 软撤销 |
Ctrl+T | 词互换 |
Ctrl+Enter | 插入行后 |
Ctrl+Shift Enter | 插入行前 |
Ctrl+K Backspace | 从光标处删除至行首 |
Ctrl+Shift+UP | 与上行互换 |
Ctrl+Shift+DOWN | 与下行互换 |
Shift+Tab | 去除缩进 |
Tab | 缩进 |
F9 | 行排序(按a-z) |