现在希望你能够求出旅行长度最小的方案,使得每个景点至少被访问到一次。
标签:define 最短路 sizeof add 题目 一个 inf 旅游 str
#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; }
标签:define 最短路 sizeof add 题目 一个 inf 旅游 str
原文地址:https://www.cnblogs.com/Diliiiii/p/10305755.html