HDU6026 Deleting Edges (最短路树计数)
2017-08-09 13:55
405 查看
题目链接
题意:
给定一个完全图,要删去一些边使之成为一棵树(n-1条边),并且每个点到0号点的距离等于原图中到0号点的最短距离分析:
没有负权边,明显的最短路树计数代码:
#define inf 0x3f3f3f3f #define mod 1000000007 #define maxn 55 int w[maxn][maxn], d[maxn], n, v[maxn]; void dijk(int st) { memset(d, 0x3f, sizeof d); memset(v, 0, sizeof v); d[st] = 0; for (int i = 0; i < n; i++) { int m = inf, tmp = -1; for (int j = 0; j < n; j++) { if (!v[j] && m > d[j]) { m = d[tmp = j]; } } if (tmp == -1) { break; } v[tmp] = 1; for (int j = 0; j < n; j++) { if (!v[j] && d[j] > d[tmp] + w[tmp][j]) { d[j] = d[tmp] + w[tmp][j]; } } } } char a[maxn]; int c[maxn]; int cmp(int i, int j) { return d[i] < d[j]; } int main() { while (~scanf("%d", &n)) { for (int i = 0; i < n; i++) { scanf("%s", a); for (int j = 0; j < n; j++) { w[i][j] = a[j] - '0'; if (w[i][j] == 0) { w[i][j] = inf; } } c[i] = i; } dijk(0); sort(c, c + n, cmp); ll ans = 1; for (int i = 1; i < n; i++) { ll p = 0; for (int j = 0; j < i; j++) { if (d[c[i]] == d[c[j]] + w[c[i]][c[j]]) { p++; } } ans = ans * p % mod; } printf("%lld\n", ans); } }
相关文章推荐
- HDU6026-Deleting Edges
- HDU6026 Deleting Edges
- 最短路径-Deleting Edges-hdu6026
- Hdu 6026 Deleting Edges【思维+最短路】
- HDU 6026 Deleting Edges【最短路】【思维题】
- spfa+dp(洛谷1144 最短路计数)
- 最短路与次短路计数
- [PAT L2-001] 紧急救援(spfa,最短路计数, dp)
- LuoguP1144 最短路计数 解题报告【SPFA/BFS】
- 洛谷 1144 最短路计数 bfs
- 最短路计数
- poj3463 最短路和次短路 计数
- 【PAT L2-001】最短路计数
- 最短路计数
- 洛谷 1144 最短路计数 bfs
- Luogu 1144最短路计数题解
- Luogu P1144 最短路计数 【最短路】 By cellur925
- 2017CCPC女生赛 hdu 6026 Deleting Edges
- [洛谷1144]最短路计数
- poj3463 Sightseeing(最短路,次短路计数)