标签:
今天给大家献上“D”级题:50212228海岛帝国:LYF的太空运输站!!
|
||||||||||||||
|
好的,以上就是50212228海岛帝国:LYF的太空运输站的题目要求,现在献上代码!!!当当当!!!
#include<iostream> using namespace std; int dis[20],book[20]={0}; int h[20],pos[20],size; void swap(int x,int y) { int t; t=h[x]; h[x]=h[y]; h[y]=t; t=pos[h[x]]; pos[h[x]]=pos[h[y]]; pos[h[y]]=t; return ; } void siftdown(int i) { int t,flag=0; while(i*2<=size&&flag==0) { if(dis[h[i]]>dis[h[i*2]]) t=i*2; else t=i; if(i*2+1<=size) if(dis[h[t]]>dis[h[i*2+1]]) t=i*2+1; if(t!=i) { swap(t,i); i=t; } else flag=1; } return ; } void siftup(int i) { int flag=0; if(i==1) return ; while(i!=1&&flag==0) { if(dis[h[i]]<dis[h[i/2]]) swap(i,i/2); else flag=1; i/=2; } return ; } int pop() { int t; t=h[1]; pos[t]=0; h[1]=h[size]; pos[h[1]]=1; size--; siftdown(1); return t; } int main() { int n,m,i,j,k; int u[30],v[30],w[30],first[20],next[30]; int inf=9999999; int count=0,sum=0; scanf("%d%d",&n,&m); for(i=1;i<=m;i++) scanf("%d%d%d",&u[i],&v[i],&w[i]); for(i=m+1;i<=2*m;i++) { u[i]=v[i-m]; v[i]=u[i-m]; w[i]=w[i-m]; } for(i=1;i<=n;i++) first[i]=-1; for(i=1;i<=2*m;i++) { next[i]=first[u[i]]; first[u[i]]=i; } book[1]=1; count++; dis[1]=0; for(i=2;i<=n;i++) dis[i]=inf; k=first[1]; while(k!=-1) { dis[v[k]]=w[k]; k=next[k]; } size=n; for(i=1;i<=size;i++) { h[i]=i; pos[i]=i; } for(i=size/2;i>=1;i--) { siftdown(i); } pop(); while(count<n) { j=pop(); book[j]=1; count++; sum+=dis[j]; k=first[j]; while(k!=-1) { if(book[v[k]]==0&&dis[v[k]]>w[k]) { dis[v[k]]=w[k]; siftup(pos[v[k]]); } k=next[k]; } } printf("%d",sum); }
首师大附中科创教育平台 我的刷题记录 0325 50212228海岛帝国:LYF的太空运输站
标签:
原文地址:http://www.cnblogs.com/mayitao/p/5884639.html