n表示点的个数,m表示边的条数,在依次输入边的起点终点与权值,输出总花费。
可用优先队列优化,需要的话请留言。
#include<iostream> #include<vector> #include<algorithm> using namespace std; bool book[100]; const int inf = 2100000000; int main() { vector<int>u[100]; vector<int>w[100]; int n,m; cin>>n>>m; int x,y,s; for(int i=0;i<m;i++){ cin>>x>>y>>s; u[y].push_back(x); u[x].push_back(y); w[x].push_back(s); w[y].push_back(s); } int dis[100]; fill(dis,dis+99,inf); int num=0; dis[1]=0; int minn=inf; int t,ans=0; while(num!=n){ minn=inf; for(int i=1;i<=n;i++){ if(dis[i]<minn&&!book[i]){minn=dis[i];t=i;} } ans+=dis[t];num++;book[t]=true; for(int i=0;i<u[t].size();i++){ if(w[t][i]<dis[u[t][i]]){ dis[u[t][i]]=w[t][i]; } } } cout<<ans<<endl; }