HDU4171--bfs+树

第一开始想成了DP。尼玛后来才发现只有N条边,那就简单了。。

从起点S遍历整棵树,从某点跳出来回到终点T,问最短路长度。然而从某点跳出时走过的路径是一个定值。。。。

长度为整棵树的边长和sum*2-d1[i]。。然后求这个值加上回学校的路长的最小值就好了

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#define INF 2000100000
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;

ll d2[maxn];
ll d1[maxn];
int vis[maxn];

struct Edge
{
    int to, len;
} edge[maxn];

struct node
{
    int id, d;
};
vector<Edge> g[maxn];

void bfs(int s)
{
    memset(vis, 0, sizeof(vis));
    memset(d1, 0, sizeof(d1));
    d1[s] = 0;
    vis[s] = 1;
    queue<node> que;
    que.push((node) {
        0, 0
    });
    while(!que.empty())
    {
        node x = que.front();
        que.pop();
        int p = x.id;
        for(int i = 0; i < g[p].size(); ++i)
        {
            Edge &e = g[p][i];
            if(!vis[e.to]) {
                d1[e.to] = d1[p] + e.len;
                vis[e.to] = 1;
                que.push((node) {
                    e.to, d1[e.to]
                });
            }
        }
    }
}
int main()
{
    //freopen("in", "r", stdin);
    int n;
    while(~scanf("%d", &n)) {
        for(int i = 0; i <= n; ++i) scanf("%I64d", d2 + i);
        int from, to, len;
        ll sum = 0;
        for(int i = 0; i < n; ++i)
        {
            scanf("%d%d%d", &from, &to, &len);
            g[from].push_back((Edge) {
                to, len
            });
            g[to].push_back((Edge) {
                from, len
            });
            sum += len;
        }
        sum *= 2;
        bfs(0);
        //for(int i = 0; i <= n; ++i) printf("%d ",d1[i]);
        //printf("\n");
        ll mx = INF;
        for(int i = 0; i <= n; ++i)
        {
            mx = min(mx, sum - d1[i] + d2[i]);
        }
        cout << mx << endl;
        for(int i = 0; i <= n; ++i) g[i].clear();
    }
}
时间: 2024-12-10 16:59:56

HDU4171--bfs+树的相关文章

poj 1383 Labyrinth【迷宫bfs+树的直径】

Labyrinth Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 4004   Accepted: 1504 Description The northern part of the Pyramid contains a very large and complicated labyrinth. The labyrinth is divided into square blocks, each of them eithe

HDU 5025 (BFS+记忆化状压搜索)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5025 题目大意: 迷宫中孙悟空救唐僧,可以走回头路.必须收集完钥匙,且必须按顺序收集.迷宫中还有蛇,杀蛇多耗时1,蛇杀完就没了.问最少耗时. 解题思路: 2014广州网赛的水题之一.当时没刷过BFS状压,结果悲剧了. 首先这题可以压钥匙,也可以压蛇,不过压钥匙内存岌岌可危,于是就压蛇吧. 设f[x][y][key][snake]为在(x,y)点,已经取得的钥匙key,以及杀蛇snake的状态. 对

ZOJ 1649 &amp;&amp; HDU 1242 Rescue (BFS + 优先队列)

Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison. Angel's friends want to save Angel. Their task is: approach Angel. We assume

HDU 2653 (记忆化BFS搜索+优先队列)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2653 题目大意:迷宫中有普通点和陷阱.其中普通点可以走可以飞,但是陷阱只能飞.走耗时1,飞耗时2.但是飞耗能1.给定一定能量P,问是否能在T秒内走出. 解题思路: 一开始SB似地认为每个点最多访问两次.其实每个点最多可以访问P次. vis[X][Y][P]表示在(x,y)点能量为P的状态. 容易出错的地方在于这个组合: @. ,虽说是飞吧,但是还是会在陷阱上卡1s,尽管下一个点是. ,但是这种情况

UVA - 1343 The Rotation Game (BFS/IDA*)

题目链接 紫书例题. 首先附上我第一次bfs+剪枝TLE的版本: 1 #include<bits/stdc++.h> 2 3 using namespace std; 4 typedef long long ll; 5 const int N=24+2,inf=0x3f3f3f3f; 6 const int b[][10]= { 7 {0,2,6,11,15,20,22}, 8 {1,3,8,12,17,21,23}, 9 {10,9,8,7,6,5,4}, 10 {19,18,17,16,1

棋盘覆盖及匈牙利算法

题目描述 Description 给出一张n*n(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少1*2的多米诺骨牌进行掩盖. 输入描述 Input Description 第一行为n,m(表示有m个删除的格子)第二行到m+1行为x,y,分别表示删除格子所在的位置x为第x行y为第y列 输出描述 Output Description 一个数,即最大覆盖格数 样例输入 Sample Input 8 0 样例输出 Sample Output 32 数据范围及提示 Data Size &am

&quot;《算法导论》之‘图’&quot;:不带权二分图最大匹配(匈牙利算法)

博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利算法 1. 前言 二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图.准确地说:把一个图的顶点划分为两个不相交集 U 和V ,使得每一条边都分别连接U.V中的顶点.如果存在这样的划分,则此图为一个二分图.二分图的一个等价定义是:不含有「含奇数条边的环」的图.

二分图的最大匹配

转载自http://blog.csdn.net/pi9nc/article/details/11848327 二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图.准确地说:把一个图的顶点划分为两个不相交集 U  和 V ,使得每一条边都分别连接U . V  中的顶点.如果存在这样的划分,则此图为一个二分图.二分图的一个等价定义是:不含有「含奇数条边的环」的图.图 1 是一个二分图.为了清晰,我们以后都把它画成图 2 的形式. 匹配:在图论中,一个「匹配」

(转)二分图的最大匹配、完美匹配和匈牙利算法

转载自http://www.renfei.org/blog/bipartite-matching.html 二分图的最大匹配.完美匹配和匈牙利算法 这篇文章讲无权二分图(unweighted bipartite graph)的最大匹配(maximum matching)和完美匹配(perfect matching),以及用于求解匹配的匈牙利算法(Hungarian Algorithm):不讲带权二分图的最佳匹配. 二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是

二分图的最大匹配、完美匹配和匈牙利算法(转)

转载自:http://blog.csdn.net/pi9nc/article/details/11848327 二分图的最大匹配.完美匹配和匈牙利算法 这篇文章讲无权二分图(unweighted bipartite graph)的最大匹配(maximum matching)和完美匹配(perfect matching),以及用于求解匹配的匈牙利算法(Hungarian Algorithm):不讲带权二分图的最佳匹配. 二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这