今天给大家献上“D”级题:50212228海岛帝国:LYF的太空运输站!!
| ||||||||||||||
|
好的,以上就是50212228海岛帝国:LYF的太空运输站的题目要求,现在献上代码!!!当当当!!!
#include<iostream>
using namespace std;
int dis[],book[]={};
int h[],pos[],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=;
while(i*<=size&&flag==)
{
if(dis[h[i]]>dis[h[i*]]) t=i*;
else t=i;
if(i*+<=size)
if(dis[h[t]]>dis[h[i*+]]) t=i*+;
if(t!=i)
{
swap(t,i);
i=t;
}
else flag=;
}
return ;
}
void siftup(int i)
{
int flag=;
if(i==) return ;
while(i!=&&flag==)
{
if(dis[h[i]]<dis[h[i/]]) swap(i,i/);
else flag=;
i/=;
}
return ;
}
int pop()
{
int t;
t=h[];
pos[t]=;
h[]=h[size];
pos[h[]]=;
size--;
siftdown();
return t;
}
int main()
{
int n,m,i,j,k;
int u[],v[],w[],first[],next[];
int inf=;
int count=,sum=;
scanf("%d%d",&n,&m);
for(i=;i<=m;i++) scanf("%d%d%d",&u[i],&v[i],&w[i]);
for(i=m+;i<=*m;i++)
{
u[i]=v[i-m];
v[i]=u[i-m];
w[i]=w[i-m];
}
for(i=;i<=n;i++) first[i]=-;
for(i=;i<=*m;i++)
{
next[i]=first[u[i]];
first[u[i]]=i;
}
book[]=;
count++;
dis[]=;
for(i=;i<=n;i++) dis[i]=inf;
k=first[];
while(k!=-)
{
dis[v[k]]=w[k];
k=next[k];
}
size=n;
for(i=;i<=size;i++)
{
h[i]=i;
pos[i]=i;
}
for(i=size/;i>=;i--)
{
siftdown(i);
}
pop();
while(count<n)
{
j=pop();
book[j]=;
count++;
sum+=dis[j];
k=first[j];
while(k!=-)
{
if(book[v[k]]==&&dis[v[k]]>w[k])
{
dis[v[k]]=w[k];
siftup(pos[v[k]]);
}
k=next[k];
}
}
printf("%d",sum);
}
50212228海岛帝国:LYF的太空运输站!!!!!