The Shortest Path Gym - 101498L 暴力求解?

https://vjudge.net/problem/Gym-101498L
题意 给你一个图 有可能存在负环 要求出权值最小路径 如果存在负环 则输出-inf
CF评测机强无敌。。。。 啥都能暴力都能过(数据太水?)
2500ms时限跑了2480ms。
思想就是暴力。
求任意两点之间最短路首先肯定是想到floyd 那么就是n^3复杂度。
然后其实边只有4000条,然后联想到用邻接表优化floyd。 然后我码力不行,写挫了,爆内存。。。。。
后面经大佬指点,可以尝试直接暴力。
先spfa求一遍最短路判负环,如果存在负环 直接输出-inf
然后对每个点进行一次dfs求最短路径。 (直接忽略换,因为正环对答案是没有贡献的,dfs碰到环的时候打个标记即可)
每次dfs最坏复杂度O(m) 要循环 n次 每次还要重新初始化记录数组
所以复杂度是O(n^2+n*m) 因该吧
第二种方法很玄学,
把所有边用邻接表存起来,然后依次递推重复n+1次。

for(int it=0;it<=n;it++)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=0;j<V[i].size();j++)
                {
                    int v=V[i][j].v;
                    int c=V[i][j].cost;
                    int u=i;
                    dis[u]=min(dis[u],dis[v]+c);
                    ans=min(ans,dis[u]);
                }
            }
        }

重复n+1次是为了能让任意两个点之间的距离都变遍历到。。
就是动态规划思想,很玄学,讲不清楚。
最后在来次O(n+m)的遍历 找一下环。
每次遍历有m条边 所以复杂度为O(m) 遍历n+1次
所以总复杂度约为为O(n*m) 吧?
第一种方法只是理论AC 没具体实现

#include <algorithm>
#include <cstdio>
#include <cstring>
#include<iostream>
#include<string>
#include <cstdlib>
#include<queue>
#include<set>
using namespace std;
const int MAX=1e6+5;
long long dis[MAX];
class node
{
public:
    long long cost;
    int v;
    node(int v,long long cost): v(v),cost(cost){}
};
vector<node> V[2005];
long long maps[2005][2005];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        scanf("%d %d",&n,&m);
        for(int i=0;i<=n;i++)
        {
            V[i].clear();
        }
        for(int i=0;i<=n;i++)
            for(int j=0;j<=n;j++)
                maps[i][j]=MAX;
        int u,v;
        long long c;
        long long ans=MAX;
        for(int i=0;i<m;i++)
        {
            scanf("%d %d %lld",&u,&v,&c);
            ans=min(c,ans);
            V[v].push_back(node(u,c));
        }
        if(ans>=0)
        {
            cout<<ans<<endl;
            continue;
        }
        int cir=0;
        for(int it=0;it<=n;it++)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=0;j<V[i].size();j++)
                {
                    int v=V[i][j].v;
                    int c=V[i][j].cost;
                    int u=i;
                    dis[u]=min(dis[u],dis[v]+c);
                    ans=min(ans,dis[u]);
                }
            }
        }
        for(int i=1;i<=n&&cir==0;i++)
        {
            for(int j=0;j<V[i].size()&&cir==0;j++)
            {
                int v=V[i][j].v;
                int c=V[i][j].cost;
                int u=i;
                if(dis[u]>dis[v]+c)
                    cir=1;
            }
        }
        if(cir)
            puts("-inf");
        else
            cout<<ans<<endl;
    }
}
GCN (Graph Convolutional Network) Shortest-Path-Master 是一种基于图卷积网络的最短路径算法。最短路径问题是图论中的经典问题,对于给定的图和起始点,找到到达目标点的最短路径。 GCN Shortest-Path-Master 通过应用图卷积神经网络的思想来解决最短路径问题。传统的最短路径算法(如Dijkstra算法或贝尔曼-福特算法)在计算过程中不考虑节点的特征信息,只利用图的拓扑结构。而GCN Shortest-Path-Master 利用了节点的特征信息,将节点的邻居节点信息通过图卷积操作进行聚合,得到节点的新特征表示。 GCN Shortest-Path-Master 的核心思想是,通过图卷积层不断更新节点的特征表示,使得节点的特征表示能够包含更多关于最短路径的信息。在每次迭代中,GCN Shortest-Path-Master 将节点的特征与邻居节点的特征进行聚合,得到节点的新特征表示。在网络的最后一层,通过对所有节点进行分类任务,可以得到每个节点到达目标点的最短路径预测。 相比传统的最短路径算法,GCN Shortest-Path-Master 提供了以下优势: 1. GCN Shortest-Path-Master 能够利用节点的特征,从而更好地表达节点之间的相互作用和联系。 2. GCN Shortest-Path-Master 可以自适应地学习节点的特征表示,而无需人工定义特征。 3. GCN Shortest-Path-Master 可以处理大规模的图结构,在计算效率上具有一定优势。 总之,GCN Shortest-Path-Master 是一种基于图卷积神经网络的最短路径算法,通过利用节点的特征信息,能够更好地解决最短路径问题。它在图结构数据中的应用具有很大潜力,在社交网络分析、推荐系统和物流路径规划等领域都有广泛的应用前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值