1 条题解
-
0
自动搬运
来自洛谷,原作者为

Itst
没钩选手瑟瑟发抖搬运于
2025-08-24 21:34:40,当前版本为作者最后更新于2018-12-27 19:33:11,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题目还算不难吧
首先我们枚举点,将其他所有点到这个点的最短路求出来
然后我们在这一次建出的最短路的反图上进行拓扑排序。假设我们算到了点,点的人流量为,点连出去的边到达的点为点集,那么对于每一个点,边的流量就会增加,会加上
总时间复杂度
强行插入自己的blog
#include<bits/stdc++.h> #define ld long double using namespace std; inline int read(){ int a = 0; char c = getchar(); while(!isdigit(c)) c = getchar(); while(isdigit(c)) a = (a << 3) + (a << 1) + (c ^ '0') , c = getchar(); return a; } inline int max(int a , int b){ return a > b ? a : b; } struct Ed{ int start , end , upEd; }ans[100001]; bool vis[301] , ifRail[301][301]; long long Times[301]; int firEd[301] , minRoute[301]; ld peo[301][301] , To[301][301]; struct cmp{ bool operator() (const int& a, const int& b ){ return minRoute[a] < minRoute[b]; } }; int main(){ int N = read() , M = read(); for(int i = 1 ; i <= M ; i++){ int a = read() , b = read(); ans[(i << 1) - 1].start = a; ans[(i << 1) - 1].end = b; ans[(i << 1) - 1].upEd = firEd[a]; firEd[a] = (i << 1) - 1; ans[i << 1].start = b; ans[i << 1].end = a; ans[i << 1].upEd = firEd[b]; firEd[b] = i << 1; ifRail[a][b] = ifRail[b][a] = 1; } for(int i = 1 ; i <= N ; i++) for(int j = 1 ; j <= N ; j++) To[i][j] = read(); for(int i = 1 ; i <= N ; i++){ memset(minRoute , 0x3f , sizeof(minRoute)); memset(Times , 0 , sizeof(Times)); minRoute[i] = 0; Times[i] = 1; queue < int > q; priority_queue < int , vector < int > , cmp > q1; q.push(i); while(!q.empty()){ int t = q.front(); q.pop(); bool f = 0; for(int j = firEd[t] ; j ; j = ans[j].upEd) if(minRoute[ans[j].end] > minRoute[t] + 1){ minRoute[ans[j].end] = minRoute[t] + 1; Times[ans[j].end] = Times[t]; q.push(ans[j].end); f = 1; } else if(minRoute[ans[j].end] == minRoute[t] + 1){ Times[ans[j].end] += Times[t]; f = 1; } if(!f) q1.push(t); } memset(vis , 0 , sizeof(vis)); vis[i] = 1; while(!q1.empty()){ int t = q1.top(); q1.pop(); for(int j = 1 ; j <= N ; j++) if(ifRail[j][t] && minRoute[j] == minRoute[t] - 1){ ld t1 = (ld)To[i][t] * Times[j] / Times[t]; peo[j][t] += t1; peo[t][j] += t1; To[i][j] += t1; if(!vis[j]){ vis[j] = 1; q1.push(j); } } } } for(int i = 1 ; i <= M ; i++) cout << fixed << setprecision(1) << peo[ans[i << 1].start][ans[i << 1].end] + 1e-8 << endl; return 0; }
- 1
信息
- ID
- 1166
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者