HDU 6026 Deleting Edges【图论】
2017-06-25 18:48
267 查看
题目链接
题意:n个顶点编号为0到n-1的图,从中删去一些边形成一棵树,保证树上任意一个点到0点的距离等于原图中0到这个点的最短路长度。求这棵树有多少种画法。
先用dijkstra算法求出原图中0点到每个点的最短路的长度,再暴力的跑一遍判断两个点A和B形成的边是否能等于A到中间点C加上C到B的长度,如果可以,就可以用这个边代替原来的边,最后相乘就是答案。要模除mod。
题意:n个顶点编号为0到n-1的图,从中删去一些边形成一棵树,保证树上任意一个点到0点的距离等于原图中0到这个点的最短路长度。求这棵树有多少种画法。
先用dijkstra算法求出原图中0点到每个点的最短路的长度,再暴力的跑一遍判断两个点A和B形成的边是否能等于A到中间点C加上C到B的长度,如果可以,就可以用这个边代替原来的边,最后相乘就是答案。要模除mod。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define ll long long const int INF = 0x3f3f3f3f; const int mod = 1000000000 + 7; int n; int e[55][55]; bool vis[55]; int d[55]; void dij(int n) { memset(vis, false, sizeof(vis)); memset(d, INF, sizeof(d)); d[0] = 0; vis[0] = true; for (int i = 1; i <= n - 1; i++) { int u = 0, MIN = INF; for (int j = 0; j < n; j++) { if (!vis[j] && d[j] < MIN) { MIN = d[j]; u = j; } } vis[u] = true; for (int v = 0; v < n; v++) { if (!vis[v]) { if (d[v] > d[u] + e[u][v]) d[v] = d[u] + e[u][v]; } } } } int main() { while (scanf("%d", &n) != EOF) { for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { char ch; scanf(" %c", &ch); e[i][j] = ch - '0'; if (e[i][j] == 0 && i != j) e[i][j] = INF; } dij(n); ll ans = 1; for (int i = 1; i < n; i++) { ll cnt = 0; for (int j = 0; j < n; j++) { if (e[i][j] && d[i] == d[j] + e[j][i]) cnt++; } ans = ans * cnt % mod; } printf("%lld\n", ans); } return 0; }
相关文章推荐
- HDU 6026 Deleting Edges
- hdu 6026 Deleting Edges
- HDU 6026 Deleting Edges
- HDU 6026 Deleting Edges【最短路】【思维题】
- 2017CCPC女生赛 hdu 6026 Deleting Edges
- Hdu 6026 Deleting Edges【思维+最短路】
- { 图论 }hdu1068
- Hdu 4619 简单图论
- HDU 1874 图论模板复习
- HDU 5652 图论之并查集
- hdu 4292 Food 【图论-网络流-最大流-Dinic】
- hdu 3605 Escape【图论-网络流-最大流-状态压缩】
- hdu 1532 Drainage Ditches(图论:最大流增广路)
- HDU 4948 (傻比图论)
- hdu 4289 Control(图论-最小割)
- (HDU 5723)2016 Multi-University Training Contest 1 Abandoned country(图论)
- 图论 DFS HDU 1241
- hdu 6026 用nlogn的dijstra敲一发
- HDU 1068(图论,二分匹配)
- HDU 6038 (2017 多校训练赛1 1006) Function(图论)