首页 > 其他分享 >【最短路】Atcoder Beginner Contest 286----E

【最短路】Atcoder Beginner Contest 286----E

时间:2023-01-25 00:00:12浏览次数:51  
标签:Atcoder typedef Beginner Contest int 短路 305 long ll

题目:E - Souvenir (atcoder.jp)

题解:首先这道题可以很容易看出来是求最短路。最开始自己是用bfs写的,出现了WA,TLE,RE等错误。

因为对于每种情况会有Q次询问,如果每次询问都跑一遍最短路就会TLE,所以可以把这到题看成是多源最短路,只需在询问前跑一遍Floyd即可。

代码:

Floyd遍历时因为不是先遍历中转点k哇了好多次

#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define ll long long
#define endl '\n'
using namespace std;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int, int> pll;
typedef unsigned long long ULL;
const ll mod = 998244353;
const int N = 2e5 + 5;
int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}
int cmp(int a, int b)
{
    return a > b;
}
int d[305][305];
ll value[305][305];
int n;
ll a[305];
void floyd()
{
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(d[i][k]+d[k][j]<d[i][j])
                {
                    d[i][j]=d[i][k]+d[k][j];
                    value[i][j]=value[i][k]+value[k][j]-a[k];
                }
                else if(d[i][k]+d[k][j]==d[i][j])
                {
                    value[i][j]=max(value[i][j],value[i][k]+value[k][j]-a[k]);
                }
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    memset(value,0,sizeof(value));
    memset(d,0x3f,sizeof(d));
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        string s;cin>>s;
        s=' '+s;
        for(int j=1;j<=n;j++)
        {
            if(i==j) d[i][j]=0;
            if(s[j]=='Y') {
                d[i][j]=1;
                value[i][j]=a[i]+a[j];
            }
        }
    }
    floyd();
    int q;
    cin>>q;
    while(q--)
    {
        int u,v;
        cin>>u>>v;
        if(d[u][v]>n) cout<<"Impossible"<<endl;
        else cout<<d[u][v]<<" "<<value[u][v]<<endl;
    }
    return 0;
}

  

标签:Atcoder,typedef,Beginner,Contest,int,短路,305,long,ll
From: https://www.cnblogs.com/hhhhy0420/p/17066555.html

相关文章

  • 【多重背包】Atcoder Beginner Contest 286----D
    题目:D-MoneyinHand(atcoder.jp)分析:经典的多重背包。用dp[i]表示i能否正好凑出。先复习一下多重背包。多重背包就是有N组物品,每组最多有k个,每组可以选多个。分组背......
  • AtCoder Beginner Contest 286 解题报告
    AtCoderBeginnerContest286解题报告\(\text{ByDaiRuiChen007}\)ContestLinkA.RangeSwap直接模拟交换过程即可时间复杂度\(\Theta(n)\)#include<bits/stdc++......
  • AtCoder Beginner Contest 286
    A-RangeSwap(abc286a)题目大意给定长度为\(n\)的数组\(a\)和\(p,q,r,s\),交换\(a[p..q]\)和\(a[r..s]\)并输出交换后的数组\(a\)。解题思路模拟即可。神奇......
  • D - Change Usernames -- ATCODER
    D-ChangeUsernameshttps://atcoder.jp/contests/abc285/tasks/abc285_d 思路DFS深度遍历图。需要注意的是,整个大图中可能有很多小的连通子图,每个子图需要确定起......
  • #0030. 「JOI Open Contest 2021」Crossing
    题目大意题目给了三个仅包含J,O,I三个字母的长度为\(N\)的字符串及某种crossing的规则。另外还给了一个相同长度的字符串\(N\),且有\(Q\)次更新,每次把该字符串一个区间......
  • #0029. 「JOI Open Contest 2021」Financial Report
    碎碎念1:是的时隔两年多笨人又想开始更博客了碎碎念2:另外今年就要AFO了希望能给自己的oi生涯画上一个完美的句号!题目大意给定\(N\)个数字和\(D\)需要从中选择一些数字......
  • AtCoder Beginner Contest 043
    A-ChildrenandCandies(ABCEdit)n=int(input())print(n*(n+1)//2)B-UnhappyHacking(ABCEdit)用栈模拟一下?但是栈的遍历比较麻烦这里用vector实现#......
  • AtCoder Beginner Contest 047
    A-FightingoverCandies签到#include<bits/stdc++.h>usingnamespacestd;intread(){...}constintN=1e6+5;intmain(){inta=read(),b=read(......
  • Atcoder ABC 285 题解
    E-WorkorRest题意​ 一周有\(n\)天,给出一个长度为\(n\)的数组\(A\)。你可以决定一周中的休息日与工作日的分布,请问如何选择能够使总贡献最大。​ 如何计算贡献......
  • AtCoder Beginner Contest 285 E(背包dp)
    E-WorkorRest题目大意:给定一周有n天,其中至少有1天为休息日,其余为工作日。同时给定一个长度为n的整型数组A,对于一个工作日,它能产生的工作值为A\(_{min(x,y)}\),其中x......