![]()
![]()
![]()
附上代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define inf 0xfffffff
int n, m;
typedef struct NODE
{
int to;
int cost;
friend bool operator < (const NODE &a, const NODE &b) {
return a.cost > b.cost;
}
}node;
typedef struct Edge
{
int from;
int next;
int to;
int w;
int value;
} edge;
edge maps[10000005];
int head[100050];
int dist[100050];
int vids[100050];
int cnt;
void creat ()
{
for(int i=0; i<100050; i++)
head[i]=-1;
cnt=0;
}
void add(int u,int v,int w)
{
maps[cnt].from = u;
maps[cnt].to=v;
maps[cnt].w=w;
maps[cnt].value = w;
maps[cnt].next=head[u];///一开始放置为-1,-1的条件就可以跳出
///下一步接着储存,head[u]的值,就是前面的位置
head[u]=cnt++;///head[u]会得到这条线的值
}
int dijkstra(int s,int t)
{
for(int i=0; i<100050; i++)
{
vids[i]=0;
dist[i]=inf;
}
priority_queue<node>que;
node begins;
begins.to=s;
begins.cost=0;
que.push(begins);
while(!que.empty())
{
node ends=que.top();
que.pop();
if(!vids[ends.to])
{
vids[ends.to]=1;
dist[ends.to]=ends.cost;
for(int i = head[ends.to]; ~i; i = maps[i].next)
{
int to = maps[i].to, w = maps[i].w;
maps[i].w = ends.cost + w;
if(!vids[to])
{
node ans;
ans.to=to;
ans.cost=ends.cost+w;
que.push(ans);
}
}
}
}
if(dist[t] == inf)
{
return -1;
}
else
{
return dist[t];
}
}
bool cmp(const edge & a, const edge & b)
{
if(a.w != b.w)
{
return a.w < b.w;
}
return a.value < b.value;
}
int pre[100050];
void Init()
{
for(int i=1; i<=m; i++)
pre[i]=i;
}
int finds(int x)
{
if(pre[x]==x)
return x;
else
return pre[x]=finds(pre[x]);
}
void unionjoin(int x,int y)
{
int u=finds(x);
int v=finds(y);
if(u==v)
return ;
else
pre[u]=v;
}
bool same(int x,int y)
{
return finds(x)==finds(y);
}
long long kruskal()
{
long long ans=0;
sort(maps,maps + 2 * m,cmp);
for(int i = 0; i< 2 * m; i++)
{
if(!same(maps[i].from,maps[i].to))
{
unionjoin(maps[i].from,maps[i].to);
ans+=maps[i].value;
}
else
continue;
}
return ans;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
creat();
for(int i = 0; i < m; i ++) {
int u, v, w;
scanf("%d%d%d",&u, &v, &w);
add(u, v, w);
add(v, u, w);
}
dijkstra(1, n);
Init();
long long re = kruskal();
printf("%lld\n",re);
}
return 0;
}