POJ 1287 Networking
最小生成树的模版题,输入数据的存储用结构体,存两个点和边,但是这道题是看百度中的有一点问题,就是题目没有说输入的边的次数,可以是两个点一直输入很多次,那样AC的代码就不成立了,所有OJ这种神奇的东西,还是懂。原来自己的想法是用map来存储结构,但是还是卡在了map 的排序上,因为那个是自己也是用新建的结构体,所以还是不会排序。
百度的AC代码就是自己写的结构来存储后新写一个排序,没有什么特别的地方,主要还是模版的应用。
#include <set>
#include <queue>
#include<algorithm>
#include <iostream>
#include<string.h>
#include<map>
#include<stack>
#include<string>
#include <stdio.h>
#include<sstream>
using namespace std;
struct edge{
int p1,p2,w;
};
edge edges[3000];
bool cmp(edge a,edge b){
return a.w<b.w;
}
int ss[55];
int num,m;
void read(){
cin>>m;
int p1,p2,dis;
for(int i=0;i<m;i++){
cin>>p1>>p2>>dis;
edges[i].p1=p1;
edges[i].p2=p2;
edges[i].w=dis;
}
sort(edges,edges+m,cmp);
}
int find(int a ){
for(;ss[a]>=0;a=ss[a]);
return a;
}
void Union(int a ,int b){
int c=find(a);
int d=find(b);
if(ss[c]<ss[d]){
ss[c]+=ss[d];
ss[d]=c;
}
else{
ss[d]+=ss[c];
ss[c]=d;
}
}
int kruskal(){
int ans=0;
memset(ss,-1,sizeof(ss));
int i=0;
int cnt=0;
int p1,p2;
while(cnt<num-1){
p1=edges[i].p1;
p2=edges[i].p2;
if(find(p1)!=find(p2)){
cnt++;
// cout<<edges[i].w<<endl;
ans+=edges[i].w;
Union(p1,p2);
}
i++;
}
return ans;
}
int main()
{
while(cin>>num){
if(num==0)
break;
read();
cout<<kruskal()<<endl;
}
return 0;
}
最后放类似的两道题
G - A Bug's Life
和
Ubiquitous Religions