1 条题解
-
0

// 最短路条数 Dijkstra 算法 O(MlogN) #include<bits/stdc++.h> #define pii pair<int,int> using namespace std; const int N=2010,M=4e6; int h[N],to[M],ww[M],ne[M],idx; void add(int a,int b,int c){ to[++idx]=b,ww[idx]=c,ne[idx]=h[a],h[a]=idx; } int n,m,g[N][N]; int d[N],cnt[N]; bool vis[N]; void dijkstra(){ memset(d,0x3f,sizeof d); d[1]=0; cnt[1]=1; priority_queue<pii,vector<pii>,greater<pii> > q; q.push({0,1}); while(!q.empty()){ int u=q.top().second; q.pop(); if(vis[u])continue; vis[u]=1; for(int i=h[u];i;i=ne[i]){ int v=to[i],w=ww[i]; if(d[v]>d[u]+w){ //如果1到v的距离可以变小 d[v]=d[u]+w; cnt[v]=cnt[u]; //那就继承最短路条数 q.push({d[v],v}); } else if(d[v]==d[u]+w){ //如果1到v的距离相等 cnt[v]=cnt[v]+cnt[u]; //那就累加最短路条数 } } } } int main(){ scanf("%d%d",&n,&m); for(int i=1,a,b,c;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); if(g[a][b]==c) continue; //去重边 add(a,b,c); g[a][b]=c; } dijkstra(); if(d[n]==0x3f3f3f3f)printf("No answer\n"); else printf("%d %d\n",d[n],cnt[n]); }
- 1
信息
- ID
- 12499
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 4
- 上传者