首页 > 其他分享 >【题解】 [USACO 2007 FEB] Cow Party S

【题解】 [USACO 2007 FEB] Cow Party S

时间:2024-08-12 21:07:04浏览次数:12  
标签:head FEB idx Cow int 题解 Dijkstra edge 定点

题目描述

题目大意

给定一个有向图,以及一个顶点。求其他所有点到给定点,再从给定点回到各自起始点的最短路中的最大值。

思路

本题主要考查:对单源最短路算法的熟练运用。

最短路总共分为2段:其他所有点到给定点、给定点回到各自起始点。

首先求第一段:可以在原图的基础上建一个反向图,再以给定点为起点跑一遍Dijkstra。
然后求第二段:直接在原图上,也是以给定点为起点跑一遍Dijkstra。

最后再将两遍Dijkstra的答案相加,取最大值即可。

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1005, M = 1e5 + 5;
int n, m, x;
int u[M], v[M], w[M];
int sum[N];

// 链式前向星 存图
int head[N], idx;
struct Edge
{
    int next, to, val;
}edge[M];

void add(int u, int v, int w)
{
    edge[idx].to = v, edge[idx].val = w;
    edge[idx].next = head[u];
    head[u] = idx ++ ;
}

void init()
{
    memset(head, -1, sizeof head);
}

// Dijkstra 模版
int dis[N];
bool vis[N];
void Dijkstra(int st)
{
    memset(dis, 0x3f, sizeof dis);
    memset(vis, false, sizeof vis);

    dis[st] = 0;
    for (int i = 1; i < n; i ++ )
    {
        int u = -1;
        for (int j = 1; j <= n; j ++ )
        if (!vis[j] && (u == -1 || dis[j] < dis[u]))
            u = j;

        vis[u] = true;
        for (int j = head[u]; ~j; j = edge[j].next )
        {
            int v = edge[j].to, w = edge[j].val;
            dis[v] = min(dis[v], dis[u] + w);
        }
    }
}

int main()
{
    scanf("%d%d%d", &n, &m, &x);
    init();
    for (int i = 1; i <= m; i ++ )
    {
        scanf("%d%d%d", &u[i], &v[i], &w[i]);
        add(v[i], u[i], w[i]); // 建反向图
    }

    Dijkstra(x);
    for (int i = 1; i <= n; i ++ ) sum[i] = dis[i]; // 保存答案

    init();
    for (int i = 1; i <= m; i ++ ) add(u[i], v[i], w[i]); // 建正向图
    Dijkstra(x);
    for (int i = 1; i <= n; i ++ ) sum[i] += dis[i]; // 将答案相加

    // 取最大值
    int ans = -0x3f3f3f3f;
    for (int i = 1; i <= n; i ++ )
        ans = max(ans, sum[i]); 
    printf("%d\n", ans);

    return 0;
}

标签:head,FEB,idx,Cow,int,题解,Dijkstra,edge,定点
From: https://www.cnblogs.com/T-hong/p/18355713

相关文章

  • 洛谷 P4305 不重复数字——题解
    洛谷P4305题解传送锚点摸鱼环节[JLOI2011]不重复数字题目描述给定\(n\)个数,要求把其中重复的去掉,只保留第一次出现的数。输入格式本题有多组数据。第一行一个整数\(T\),表示数据组数。对于每组数据:第一行一个整数\(n\)。第二行\(n\)个数,表示给定的数。输出格......
  • 【题解】 热浪
    题目描述【题目描述】德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品。FarmerJohn此时以先天下之忧而忧,后天下之乐而乐的精神,身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛......
  • [题解 hduoj-7522] 2024HDU 暑假多校7 - cats 的最小生成树
    原题链接题意有一个有重边的无向图,每次找到它的最小生成树,并删除生成树的边,直到不存在最小生成树,问被每条边在第几次被删除.思路考虑用类似Kruskal算法,但是是遍历一遍所有边,同时处理出来所有的生成树.具体这样做:如Kruskal一样,把所有边按边权排序,......
  • GBNC 题解
    GBNC题解这可比平时做的红题难吧。题目以思维为主,和CCF的趋势有点挂钩。题目实际难度:橙-,橙,橙,黄。不知道从哪听到的消息,说你们的信息思维都特别好,所以就没有大红题了。T1思路这道题我们能用模拟来写。我们可以将这整个询问分为\(n\)个小询问。每次询问我们用一个整形\(......
  • [题解]P3966 [TJOI2013] 单词
    P3966[TJOI2013]单词用\(p[i]\)来表示经过节点\(i\)的字符串个数。那么节点\(u\)的答案就是fail树上,以\(u\)为根的子树的\(p\)之和。由于我们已经计算了\(p[i]\),所以字符串\(i\)作为模式串本身&模式串前缀的情况已经考虑了。还需考虑\(i\)作为模式串后缀的情况,而只有fail树上......
  • 【题解】 小狗
    题目描述【题目描述】小Q是个爱狗狂魔,他饲养了N(N<=2000)条中华田园犬狗和M(M<=2000)条秋田犬。并且给每条狗取了一个英文名字,例如:Sally,Sussan,Lysa等,为了方便起见,小Q登记时只会登记首字母,例如Sally、Sussan、Lysa只会登记为S、S、L。现在中华田园犬......
  • 题解:NOIP2023 天天爱打卡
    题解:NOIP2023天天爱打卡标签:线段树优化dp先考虑一个朴素的dp,\(f[i]\)表示前\(i\)天,第\(i\)天必打卡能得到的最大能量,有转移:\[f[i]=\max_{j=i-k+1}^{i}(val(j,i)-d\times(i-j+1)+\max_{p=1}^{j-2}f[p])\]\(val(j,i)\)表示第\(j\simi\)天完成的挑战.......
  • [题解]P2292 [HNOI2004] L 语言
    P2292[HNOI2004]L语言注:下文中,\(s[l\simr]\)表示截取字符串\(s\)的第\(l\)个字符到第\(r\)个字符。文字描述的字符串下标从\(1\)开始,但代码实现从\(0\)开始。我们建出AC自动机后,有一个比较暴力的思路。我么用\(f[i]\)表示待查找字符串\(t\)的长度为\(i\)前缀是否满足......
  • AtCoder ABC 366题解
    前言本文部分思路来自于网络,仅供参考。A-Election2题目大意给定两个市长候选人的票数,求结果是否已经确定。解题思路如果剩下的人全部投票给票少的人票少的人也不能赢,则结果就已经确定了。code#include<bits/stdc++.h>usingnamespacestd;intmain(){intn,t,......
  • ABC366D 题解
    第一眼是想写\(kd-tree\)的。然后发现这就是一道三维前缀和的板子题。三维前缀和要想学习三维前缀和,我们首先得了解前缀和的概念,并且学会一维、二维前缀和。什么是前缀和前缀和是容斥原理的典型应用。这种优化方式可以使求和操作的时间复杂度降低到\(O(1)\)(但是需要提前预......