题目大意:
输入n,p;n个点,p条路
接下来n行输入c[];在各个点需要花费的时间
接下来p行输入u,v,w;u点到v点的路需要花费时间w
求经过所有点且最后回到起点的最少花费时间
https://blog.csdn.net/HY_VFenux/article/details/68954199
将每条边的权值存为 路径花费*2+两端点花费
Kruscal求MST 最后加上开始位于起点的花费 即各个点中最少花费的一个
#include <bits/stdc++.h> #define INF 0x3f3f3f3f #define N 10005 #define P 100005 using namespace std; int n,m,a[N],root[N]; struct NODE { int n,t,c; bool operator <(const NODE& b) const{ return c<b.c; } }no[P]; int getroot(int man) { if(root[man]==man) return man; return root[man]=getroot(root[man]); } int main() { scanf("%d%d",&n,&m); int mina=INF; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); root[i]=i; mina=min(mina,a[i]); } int len=0; while(m--) { int u,v,w; scanf("%d%d%d",&u,&v,&w); no[len++]={u,v,2*w+a[u]+a[v]}; } sort(no,no+len); int cnt=0, ans=0; for(int i=0;i<len;i++) { int u=no[i].n, v=no[i].t, w=no[i].c; int ru=getroot(u), rv=getroot(v); if(ru!=rv){ root[rv]=ru; cnt++; ans+=w; }//printf("%d\n",ans); if(cnt==n-1) break; } printf("%d\n",ans+mina); return 0; }
原文地址:https://www.cnblogs.com/zquzjx/p/9286381.html
时间: 2024-10-27 04:34:42