竞赛讨论区 > Floyd算法+DFS,为什么会内存超限呢?
头像
wawalo
发布于 2022-04-06 22:41
+ 关注

Floyd算法+DFS,为什么会内存超限呢?

对于点到点的最短距离,使用Floyd算法来求解,因为只有10个询问点所以dfs是可以解决的,对于题目所有的数据都需要数组来储存,这是正常的吧,dfs所要使用的数组就是vis标记数组了,为什么还会内存超限呢?

救救我,救救我,救救我……

#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int N=400+5;
const int mod=1e9+7;

int dis[22][22];
struct node{
    int s,e;
    int l,r;
}w[12];
int n,m,q,ans;
int vis[12];

inline void dfs(int x,int now,int cnt)
{
    ans=max(ans,cnt);
//    printf("x=%d  now=%d  cnt=%d \n",x,now,cnt);
    for(int i=1;i<=q;i++)
    {
        int y=w[i].s;
        int next=w[i].e;
        if(now + dis[x][y]<= w[i].l)
        {
            int len=now + dis[x][y]+(w[i].l-(now + dis[x][y]));
            if(len+dis[y][next]<=w[i].r)
            {
                vis[i]=1;
                dfs(next,len+dis[y][next],cnt+1);
                vis[i]=0;
            }
        }
        else 
        {
            int len=now + dis[x][y];
            if(len+dis[y][next]<=w[i].r)
            {
                vis[i]=1;
                dfs(next,len+dis[y][next],cnt+1);
                vis[i]=0;
            }
        }
    }
    return ;
}

int main()
{
    memset(dis,0x3f,sizeof(dis));
    scanf("%d%d%d",&n,&m,&q);
    for(int i=1;i<=m;i++)
    {
        int x,y,w;
        scanf("%d%d%d",&x,&y,&w);
        dis[x][y]=dis[y][x]=w;
    }

    for(int k=1;k<=n;k++)
    {
        dis[k][k]=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(dis[i][j]>dis[i][k]+dis[k][j])
                    dis[i][j]=dis[i][k]+dis[k][j];
    }

    for(int i=1;i<=q;i++)
        scanf("%d%d%d%d",&w[i].s,&w[i].e,&w[i].l,&w[i].r);

    dfs(1,0,0);

    printf("%d\n",ans);

    return 0;
} 

全部评论

(1) 回帖
加载中...
话题 回帖

本文相关内容

等你来战

查看全部

热门推荐