Smile House

Smile House

https://ac.nowcoder.com/acm/problem/109328

题意

给你 个点, 条边的无向图,但一条无向边的两个方向的边权不同,求图上最小正环的大小。

分析

考虑 转移式,设 表示走了不超过 条边,从 的最大边权(走不通为极小值)。
那么转移为:

在我们计算答案时,我们考虑使用倍增。
先尝试走了不超过 条边从 走到了 的最小边权和, 从大到小枚举。
1.如果没有正环,说明答案大于 ,那么下一步增加 条边。
转移时需用到上一次状态,用 记录上一次尝试 的最长路径。
2.如果有正环,说明答案小于等于 ,那么下一步尝试 条边。

代码

#include<bits/stdc++.h>
#define ll long long
const int N=300+5,M=10,INF=0x3f3f3f3f,mod=998244353;
using namespace std;

int n,m,x,y,z,w,ans;
int dp[M+5][N][N];
int tmp[N][N] ,now[N][N];

inline int read()
{
    register int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}

int qpow(int a,int b)
{
    int ans=1;
    while(b){if(b&1) ans=ans*a%mod;a=a*a%mod;b>>=1;}
    return ans;
}

int main()
{
    memset(now,0xcf,sizeof(now));
    memset(dp,0xcf,sizeof(dp));
    n=read();m=read();
    for(int i=1;i<=m;i++)
    {
        int x=read(),y=read(),z=read(),w=read();
        dp[0][x][y]=z;dp[0][y][x]=w;
    }
    for(int i=1;i<=n;i++)
        now[i][i]=0,dp[0][i][i]=0;
    for(int s=1;s<=M;s++)
     for(int k=1;k<=n;k++)
      for(int i=1;i<=n;i++)
       for(int j=1;j<=n;j++)
        dp[s][i][j]=max(dp[s][i][j],dp[s-1][i][k]+dp[s-1][k][j]);
    for(int s=M;s>=0;s--) 
    {
        memset(tmp,0xcf,sizeof(tmp));
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    tmp[i][j]=max(tmp[i][j],now[i][k]+dp[s][k][j]);
        bool f=0;
        for(int i=1;i<=n;i++)
         if(tmp[i][i]>0) 
          {f=1;break;}
        if(f) continue;
        else
        {
            for(int i=1;i<=n;i++)
             for(int j=1;j<=n;j++)
              now[i][j]=tmp[i][j];
            ans+=1<<s;
        }
    }
    printf("%d",ans>=n?0:ans+1);
    return 0;
}
全部评论

相关推荐

HR_丸山彩同学:你的项目描述里,系统设计讲了很多:MemCube是什么、三级存储架构怎么设计、四种遗忘策略分别是什么。这些面试的时候讲没问题,但简历上不需要这么细。 简历要突出的是影响力,不是实现细节。面试官看简历的时候想知道的是「这个项目有多大价值」,不是「这个项目具体怎么实现的」。实现细节是面试时候聊的 怎么改:技术细节可以精简为一句「采用三级存储架构+四种遗忘策略」,把省出来的篇幅用来写影响力。比如:项目有没有开源?有没有写成技术博客?有没有被别人使用过? 校园经历没有任何信息量,任何人都可以写这句话,写了等于没写。更关键的是,你投的是技术岗,校园活动经历本来就不是加分项。如果非要写,必须写出具体的数字和成果。如果你没有这些数字,那就老老实实删掉 「端到端耗时缩减30-40%」要给出确切数字和绝对值。从1000ms降到600ms是降了40%,从100ms降到60ms也是降了40%,但这两个含义完全不一样。其他也是,涉及到数据,准备好证据,口径统一,面试会问 「熟练」「熟悉」「了解」混在一起用,读起来很乱。而且「了解前端需求」最好改成「具备前后端协作经验」
点赞 评论 收藏
分享
02-10 13:41
西南大学 Java
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务