来源:https://www.luogu.org/problemnew/show/P3366
1.记得考虑重边!!!
2.向量用法
定义(此例子为向量数组):vector <int> M[1000];
输入:M[i].push_back(x);
向量大小:for (i=0;i<M[j].size();i++)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
struct node
{
int y,len;
};
const int maxSize=5000,maxValue=0x7fffffff;
int n,m;
int dis[maxSize+5],vis[maxSize+5];
vector <node> M[maxSize+5];
int main()
{
int i,x,y,z,tot,ans,min1,j;
node n1;
freopen("a.txt","r",stdin);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
dis[i]=maxValue;
memset(vis,0,sizeof(vis));
for (i=0;i<m;i++) //输入边
{
scanf("%d%d%d",&x,&y,&z);
n1.y=y; n1.len=z;
M[x].push_back(n1);
n1.y=x;
M[y].push_back(n1);
if (x==1) //以第一个点为起始点
dis[y]=min(dis[y],z); //注意重边
else if (y==1)
dis[x]=min(dis[x],z);
}
tot=1; //记录点数
ans=0; vis[1]=1;
while (tot<n)
{
min1=maxValue;
for (i=1;i<=n;i++)
{
if (min1>dis[i] && vis[i]==0)
{
min1=dis[i];
j=i;
}
}
tot++; //找到一个新点
vis[j]=1;
ans+=dis[j];
for (i=0;i<M[j].size();i++) //更新与新点连的边
{
n1=M[j][i];
if (dis[n1.y]>n1.len && vis[n1.y]==0)
dis[n1.y]=n1.len;
}
}
printf("%d\n",ans);
return 0;
}