1. 程式人生 > >【Spfa/最短路模板】遍歷所有點的最短路徑

【Spfa/最短路模板】遍歷所有點的最短路徑

ack 現在 edge 模板 true 接下來 push_back its bsp

題目描述

明明暑假來濟南旅遊旅遊,他打算遊玩N個旅遊景點,N-1條雙向連接的道路將它們聯通起來,每一條道路有固定長度。一開始明明位於1號景點。
現在希望你能夠求出旅行長度最小的方案,使得每個景點至少被訪問到一次。

輸入

第一行兩個整數N,代表景點數目。
接下來N-1行,每行三個整數s, t, w,表示有一條從s到t的雙向道路,長度為w。s和t的編號從1開始。

輸出

一行一個整數,代表能夠訪問每個景點至少一次的方案的最小旅行長度。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const
int INF=0x3f3f3f3f; const int maxn=50005; struct Edge { int v; int cost; Edge(int _v=0,int _cost=0):v(_v),cost(_cost){} }; vector<Edge> E[maxn]; void addedge(int u,int v,int w) { E[u].push_back(Edge(v,w)); } bool vis[maxn]; int cnt[maxn]; int dist[maxn]; bool spfa(int st,int n) { memset(vis,
false,sizeof vis); for(int i=1;i<=n;i++) dist[i]=INF; vis[st]=true; dist[st]=0; queue<int>qu; while(!qu.empty()) { qu.pop(); } qu.push(st); memset(cnt,0,sizeof cnt); cnt[st]=1; while(!qu.empty()) { int u=qu.front(); qu.pop(); vis[u]
=false; for(int i=0;i<E[u].size();i++) { int v=E[u][i].v; if(dist[v]>dist[u]+E[u][i].cost) { dist[v]=dist[u]+E[u][i].cost; if(!vis[v]) { vis[v]=true; qu.push(v); if(++cnt[v]>n) return false; } } } } return true; } int vis0[50005]; int main() { int n; scanf("%d",&n); int u, v, w; int ant=0,mx=0; for (int i = 1; i <= n-1; i++) { scanf("%d %d %d",&u,&v,&w); ant+=w; addedge(u,v,w); addedge(v,u,w); vis0[u]=0; vis0[v]=1; } ant*=2; spfa(1,n); for(int i=1;i<=n;i++) { mx=max(mx,dist[i]); } printf("%d\n",ant-mx); return 0; }

【Spfa/最短路模板】遍歷所有點的最短路徑