首页 > 代码库 > oj---krus--丛林中的路
oj---krus--丛林中的路
错误分析:合并集合的时候,不是把边的两个端点修改关系,而是把两个端点的根修改关系。合并集合是对两个集合的根的操作。
建议:最好还是初始化根为自身吧,初始化为-1感觉有点别扭(虽然初始化的时候快一点)。
AC:
#include<cstdio> #include<map> #include<algorithm> #include<string> using namespace std; int father[30]; int findfather(int x){ /*if (father[x]==-1) return x;*/ if(father[x]==x) return x; else { int tmp=findfather(father[x]); father[x]=tmp; return tmp; } } struct Edge{ int ida,idb; int weight; }edge[80]; bool cmp(Edge a,Edge b){ return a.weight<b.weight; } map<string,int> M; char str[3]; string tstr[28]; int main(){ int n;int tmpn; while(scanf("%d",&n)!=EOF&&n!=0){ int edgen=0;int noden=0; M.clear(); //fill(father,father+30,-1); for(int i=0;i<n;i++) father[i]=i; for(int rowi=0;rowi<n-1;rowi++){ int stri=0; scanf("%s",str); if(M.find(str)==M.end()){ M[str]=noden++; //printf("char %s:id %d\n",str,noden-1); } tstr[stri++]=str; scanf("%d",&tmpn); for(int j=0;j<tmpn;j++){ scanf("%s",str); tstr[stri++]=str; if(M.find(str)==M.end()){ M[str]=noden++; // printf("char %s:id %d\n",str,noden-1); } scanf("%d",&edge[edgen].weight); edge[edgen].ida=M[tstr[0]]; edge[edgen].idb=M[tstr[(stri-1)]]; edgen++; } } sort(edge,edge+edgen,cmp); /*for(int i=0;i<=edgen-1;i++){ printf("%d\n",edge[i].weight); }*/ int sum=0; for(int i=0;i<=edgen-1;i++){ if(findfather(edge[i].ida)!=findfather(edge[i].idb)){ // printf("edge id: %d\n",i); // printf("node ida:%d idb:%d\n",edge[i].ida,edge[i].idb); sum+=edge[i].weight; //father[edge[i].ida]=edge[i].idb; father[findfather(edge[i].ida)]=findfather(edge[i].idb); } } bool ismst=1; int cnt=0; for(int i=0;i<=noden-1;i++){ if(father[i]==-1) cnt++; //printf("%d",cnt); if(cnt>1) ismst=false; } if(ismst){ printf("%d\n",sum); } } return 0; }
oj---krus--丛林中的路
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。