CSP赛前集训【摧毁道路】

在CSP赛前集训中,一道名为‘摧毁道路’的思维题引起了注意。虽然大部分选手能获得六十分,但完全解出题目的关键在于理解和优化每个数据点的弱点。该题要求预处理所有点对之间的最短距离,解决方案为O(n^2)的时间复杂度。通过枚举中间节点找出s1到t1与s2到t2路径的交集,计算答案,然而考场中少有人想到这种方法。
摘要由CSDN通过智能技术生成

摧毁道路

题目描述:(暂不公开)

这道题的数据也是蛮有意思,有六十分是可以拿的。
但是自己写了六十分只拿到五十分。

主要是针对每个数据的弱点吧。
考场代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 3000;
const int INF = 0x3f3f3f3f;

inline int max(int a,int b) {
    return a > b ? a : b; }

inline int min(int a,int b) {
    return a < b ? a : b; }

inline void read(int &x)
{
   
    char ch = getchar(); x = 0;
    for(;ch < '0' || ch > '9';) ch = getchar();
    for(;ch >= '0' && ch <= '9';) x = x * 10 + (ch ^ '0'), ch = getchar();
}

struct Edge{
    int to,nxt,val,bz; } g[N << 1];
int last[N],cnt = 1;
int n,m,s1,t1,l1,s2,t2,l2,ans = -1;
int dis[N],dep[20],l,r,q[N << 2],vis[N],fa[N];

void add(int u,int v,int w) {
    g[++cnt] = (Edge){
    v,last[u],w,1 }, last[u] = cnt; }
void Add_Edge(int u,int v,int w) {
    add(u,v,w), add(v,u,w); }

void work_dis()
{
   
    memset(dis,INF,sizeof dis), dis[s1] = 0;
    vis[q[l = r = 1] = s1] = 1;
    for(;l <= r; ++ l)
    {
   
        for(int i = last[q[l]];i;i = g[i].nxt)
            if(dis[g[i].to] > dis[q[l]] + g[i].val)
            {
   
                dis[g[i].to] = dis[q[l]] + g[i].val;
                if(!vis[g[i].to]) vis[q[++r] = g[i].to] = 1;
            }
        vis[q[l]] = 0;
    }
    if(dis[t1] <= min(l1,l2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值