对于点到点的最短距离,使用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) 回帖