#include<iostream> #include<algorithm> #include<numeric> #include<cstring> #define fo(i,a,b) for(int i=a;i<=b;i++) #define foa(j,a,b) for(int j=a;j<=b;j++) #define mem(name,n) memset(name,n,sizeof(name)) using namespace std; const int inf=0x3f3f3f3f; const int maxn=1005; int e[maxn][maxn],book[maxn],dis[maxn]; int main()//Dijkstra { int n,m; cin>>n>>m; fo(i,1,n) fo(j,1,n) if(i==j) e[i][j]=0; else e[i][j]=inf; int a,b,c; fo(i,1,m) { cin>>a>>b>>c; e[a][b]=min(c,e[a][b]); } fo(i,1,n) dis[i]=e[1][i]; mem(book,0); book[1]=1;//分为两个集合 一个用来存已经确定的点 //核心 int min,u,v; fo(i,1,n-1) { min=inf; foa(j,1,n) {//找离源点最近的未确定的点 if(book[j]==0&&dis[j]<min) { min=dis[j]; u=j; } } book[u]=1; fo(v,1,n) { if(e[u][v]<inf) { if(dis[v]>dis[u]+e[u][v]) dis[v]=dis[u]+e[u][v];//松弛 } } } dis[0]=0; cout<<accumulate(dis,dis+n+1,0)<<endl; return 0; }