1443 路径和树

题目来源: CodeForces
基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题
收藏
关注

给定一幅无向带权连通图G = (V, E) (这里V是点集,E是边集)。从点u开始的最短路径树是这样一幅图G1 = (V, E1),其中E1是E的子集,并且在G1中,u到所有其它点的最短路径与他在G中是一样的。

现在给定一幅无向带权连通图G和一个点u。你的任务是找出从u开始的最短路径树,并且这个树中所有边的权值之和要最小。

Input
单组测试数据。
第一行有两个整数n和m(1 ≤ n ≤ 3*10^5, 0 ≤ m ≤ 3*10^5),表示点和边的数目。
接下来m行,每行包含3个整数 ui, vi, wi ,表示ui和vi之间有一条权值为wi的无向边(1 ≤ ui,vi ≤ n, 1 ≤ wi ≤ 10^9)。
输入保证图是连通的。
最后一行给出一个整数u (1 ≤ u ≤ n),表示起点。
Output
输出这棵树的最小的权值之和。
Input示例
3 3
1 2 1
2 3 1
1 3 2
3
Output示例
2
 /*
利用spfa求出最短路之后, 然后根据dist数组中的值去寻找某个点最短路径的上一条边,然后对这些边求最小生成树
这里会出现一个问题,是否在求出每个点的最短路的上一条边之后,这个子图就变成了一个最小生成树了呢?
有可能,但也有可能出现这种情况:
某个点到起点的最短路可以通过多种路径实现,这种情况下,但是如果不用最小生成树的话,无法确定最小生成树中是哪一条路径
因此需要求最短路
ex:
6 8
1 2 30
1 3 20
2 3 50
4 2 100
2 5 40
3 5 10
3 6 50
5 6 60
4
答案为:
230
*/
#include<bits/stdc++.h>
#define LL long long
#define MAXN 300005
using namespace std;
int n, m;
LL dist[MAXN];
int inQueue[MAXN], root[MAXN];
int in[MAXN];
vector <pair< int, LL> > G[MAXN];
queue <int> Q;
struct Edge
{
int u, v;
LL cost;
Edge(int U = -, int V = -, LL C = -)
{
u = U;
v = V;
cost = C;
}
bool operator < (const Edge& x) const
{
return cost < x.cost;
}
};
vector <Edge> edge;
int findRoot(int x)
{
if(x == root[x]) return x;
else
return root[x] = findRoot(root[x]);
}
void unite(int x, int y)
{
x = findRoot(x);
y = findRoot(y);
if(x == y) return;
root[x] = root[y];
}
void spfa(int star)
{
memset(dist, -, sizeof(dist));
memset(inQueue, , sizeof(inQueue));
while(!Q.empty()) Q.pop();
dist[star] = ;
inQueue[star] = ;
Q.push(star);
while(!Q.empty())
{
int now = Q.front();
Q.pop();
inQueue[now] = ;
int siz = G[now].size();
for(int i = ; i < siz; i++)
{
int v = G[now][i].first;
LL cost = G[now][i].second;
if(dist[v] == - || dist[v] > dist[now] + cost)
{
dist[v] = dist[now] + cost;
if(!inQueue[v])
{
inQueue[v] = ;
Q.push(v);
}
}
}
}
}
LL Kruskal()
{
LL res = ;
memset(in, , sizeof(in));
sort(edge.begin(), edge.end());
int siz = edge.size();
for(int i = ; i < siz; i++)
{
int u = edge[i].u, v = edge[i].v;
LL cost = edge[i].cost;
if(in[v] || findRoot(u) == findRoot(v)) continue;
in[v] = ;
unite(u, v);
res += cost;
}
return res;
}
int main()
{
freopen("data.in","r",stdin);
while(scanf("%d%d", &n, &m) != EOF)
{
for(int i = ; i <= n; i++)
{
G[i].clear();
root[i] = i;
}
for(int i = ; i < m; i++)
{
int u, v, cost;
scanf("%d%d%d", &u, &v, &cost);
G[u].push_back(make_pair(v, (LL)cost));
G[v].push_back(make_pair(u, (LL)cost));
}
int star;
scanf("%d", &star);
spfa(star);
edge.clear();
LL sum=;
// cout<<star<<endl;
// for(int i=1;i<=n;i++){
// cout<<dist[i]<<"\t";
// }
// cout<<endl;
for(int i = ; i <= n; i++)
{
//cout<<22222<<endl;
///if(i!=star){
int siz = G[i].size();
//cout<<siz<<endl<<endl;
for(int j = ; j < siz; j++)
{ int v = G[i][j].first;
LL cost = G[i][j].second;
if(dist[v] == dist[i] + cost)
{
edge.push_back(Edge(i, v, cost));
//sum+=cost;
//cout<<111111<<endl;
//cout<<i<<"\t"<<v<<"\t"<<sum<<endl;
//break;
}
}
///}
}
printf("%lld\n", Kruskal());
//printf("%lld\n",sum);
}
return ;
}

51nod11443-路径和树(图论,最短路,最小生成树)的更多相关文章

  1. 51nod 1443 路径和树(最短路)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1443 1443 路径和树 题目来源: CodeForces ...

  2. 图论(最短路&最小生成树)

    图论 图的定义与概念 图的分类 图,根据点数和边数可分为三种:完全图,稠密图与稀疏图. 完全图,即\(m=n^2\)的图\((m\)为边数,\(n\)为点数\()\).如: 1 1 0 1 2 1 1 ...

  3. 51nod 1443 路径和树(最短路树)

    题目链接:路径和树 题意:给定无向带权连通图,求从u开始边权和最小的最短路树,输出最小边权和. 题解:构造出最短路树,把存留下来的边权全部加起来.(跑dijkstra的时候松弛加上$ < $变成 ...

  4. [BZOJ1576] [BZOJ3694] [USACO2009Jan] 安全路径(最短路径+树链剖分)

    [BZOJ1576] [BZOJ3694] [USACO2009Jan] 安全路径(最短路径+树链剖分) 题面 BZOJ1576和BZOJ3694几乎一模一样,只是BZOJ3694直接给出了最短路树 ...

  5. Day3 最短路 最小生成树 拓扑排序

    Day3 最短路 最小生成树 拓扑排序 (一)最短路 一.多源最短路 从任意点出发到任意点的最短路 1. Floyd \(O(n^3)\) for(int k=1;k<=n;k++) for(i ...

  6. python图论包networks(最短路,最小生成树带包)

    官方文档: https://networkx.github.io/documentation/networkx-1.10/reference/algorithms.html 最短路和最小生成树: im ...

  7. 51nod 1443 路径和树——最短路生成树

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1443 不只是做一遍最短路.还要在可以选的边里选最短的才行. 以为是 ...

  8. 图论--最短路--dijkstra(含路径输出)模板

    #include<iostream> #include<stack> #include<queue> #include<cstring> #includ ...

  9. 图论--最短路--Floyd(含路径输出)

    #include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f #define maxn 1005 int D[ma ...

  10. 树的问题小结(最小生成树、次小生成树、最小树形图、LCA、最小支配集、最小点覆盖、最大独立集)

    树的定义:连通无回路的无向图是一棵树. 有关树的问题: 1.最小生成树. 2.次小生成树. 3.有向图的最小树形图. 4.LCA(树上两点的最近公共祖先). 5.树的最小支配集.最小点覆盖.最大独立集 ...

随机推荐

  1. js中‘0’到底是 true 还是 false

    if ('0') alert("'0' is true");  if ('0' == false) alert("'0' is false");结果是,两次都 ...

  2. redis配置文档细节问题

    在window10环境下,redis的.conf配置文件在使用时,不可以有多余的空白符.比如为了对其在配置的前方添加两个空格. 这么做会导致redis-server使用这个配置文件的时候无法正常启动, ...

  3. EM 算法(二)-KMeans

    KMeans 算法太过简单,不再赘述 本文尝试用 EM 算法解释 KMeans,而事实上 KMeans 算是 EM 的一个特例 EM 算法是包含隐变量的参数估计模型,那对应到 KMeans 上,隐变量 ...

  4. 通过Playbook部署LAMP

    Ansible的PlayBook文件格式为YAML语言,所以希望你在编写PlayBook前对YAML语法有一定的了解,否则在运行PlayBook的时候经常碰到语法错误提示,这里我们通过介绍批量部署LA ...

  5. maven的配置以及使用

    1.下载并配置 下载之后解压,并配置系统环境变量(网上的方法很多),配置maven的环境变量之前确保java的环境变量已经配置成功. 2.eclipse安装maven插件 eclipse安装maven ...

  6. MVC 部署到服务器

    1.Nuget程序包管理 —>程序包管理控制台,运行以下命令即可:Update-Package Microsoft.AspNet.WebApi -reinstall 2.dll文件的缺少,覆盖

  7. 03 Redis发布与订阅

    以qq群的公告,单个发布者,多个收听者为例 发布/订阅 实验 发布订阅的命令 PUBLISH channel msg 将信息 message 发送到指定的频道 channel SUBSCRIBE ch ...

  8. 让IE6、IE7、IE8、IE9、IE10、IE11支持Bootstrap的解决方法

    最近做一个Web网站,之前一直觉得bootstrap非常好,这次使用了bootstrap3,在chrome,firefox,safari,opera,360浏览器(极速模式).搜狗浏览器等浏览器下均没 ...

  9. 解决GitHub添加sshkey仍然无法访问clone远程仓库的问题

    1 ssh -v git@github.com 通过这个命令打印调试信息 ebug1: expecting SSH2_MSG_NEWKEYS debug1: SSH2_MSG_NEWKEYS rece ...

  10. EfficientNet学习笔记

    EfficientNet是谷歌大脑在2019年提出的,论文地址是:https://arxiv.org/pdf/1905.11946.pdf 这篇文章主要想解决的一个问题是,如何平衡网络的深度.宽度和分 ...