dijkstra求助

P1613 跑路

@[return_dirt](/user/180059) 你这样加边他的边数不止10000条
by w23c3c3 @ 2020-11-03 09:04:22


您edge开小了.. ~~加个5就过了~~ ```cpp #include <cstdio> #include <algorithm> #include <queue> #define int long long using namespace std; struct EDGE{ int l; int to; // }edge_now[10000]; }edge_now[100005]; int head[60]; int cnt; void add(int start,int end) { cnt++; edge_now[cnt].l=head[start]; edge_now[cnt].to=end; head[start]=cnt; } typedef pair<int,int> P; priority_queue <P,vector<P>,greater<P> > q; int vis[60]; int dis[60]; void dijkstra() { dis[1]=0; q.push(make_pair(dis[1],1)); while(!q.empty()) { int point=q.top().second; q.pop(); if(vis[point]==1)continue; vis[point]=1; for(int i=head[point];i;i=edge_now[i].l) { dis[edge_now[i].to]=min(dis[edge_now[i].to],dis[point]+1); q.push(make_pair(dis[edge_now[i].to],edge_now[i].to)); } } } int n,m; int a1,b1; int edge[60][60][65]; signed main() { scanf("%lld%lld",&n,&m); for(int i=1;i<=m;i++) { scanf("%lld%lld",&a1,&b1); edge[a1][b1][0]=1; } for(int k=1;k<=64;k++) { for(int p1=1;p1<=n;p1++) { for(int p2=1;p2<=n;p2++) { for(int p3=1;p3<=n;p3++) { if(edge[p1][p3][k-1]&&edge[p3][p2][k-1]) { edge[p1][p2][k]=1; } } } } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int k=0;k<=64;k++) { if(edge[i][j][k]==1) add(i,j); } } } for(int i=2;i<=n;i++)dis[i]=0x3f3f3f; dis[1]=0; q.push(make_pair(0,1)); dijkstra(); printf("%lld",dis[n]); return 0; } ```
by Maxmilite @ 2020-11-03 09:07:30


@[寒冰大大](/user/38636) @[Maxmilite](/user/274993) @[w23c3c3](/user/109942) 谢谢各位 我明白了 完结
by return_dirt @ 2020-11-03 09:13:05


~~话说数组开小不是re吗~~
by return_dirt @ 2020-11-03 09:14:37


~~话说这题不是答案在maxlongint内吗(~~
by 寒冰大大 @ 2020-11-03 09:16:55


|