HDOJ 6026 最短路

链接:

http://acm.hdu.edu.cn/showproblem.php?pid=6026

题意:

给你一个无向图,要求你删边删成一棵树,要求从0到每个节点的路径都是原图中的最短路

题解:

最短路,先建一个只包含最短路的有向无环图,每一个点选择任意一条入边即可生成一个树形图,那么树的种类就等于每个点的入度乘积

代码:

31 int n;
32 int G[60][60];
33 int d[60];
34 ll a[60];
35 
36 void dijkstra(int s) {
37     priority_queue<PII, vector<PII>, greater<PII> > que;
38     memset(d, 0x3f, sizeof(d));
39     d[s] = 0;
40     que.push(mp(0, s));
41     while (!que.empty()) {
42         PII p = que.top(); que.pop();
43         int v = p.second;
44         if (d[v] < p.first) continue;
45         rep(i, 0, n) if (G[v][i]) {
46             if (d[i] > d[v] + G[v][i]) {
47                 d[i] = d[v] + G[v][i];
48                 que.push(mp(d[i], i));
49                 a[i] = 1;
50             }
51             else if (d[i] == d[v] + G[v][i]) a[i]++;
52         }
53     }
54 }
55 
56 int main() {
57     while (cin >> n) {
58         memset(a, 0, sizeof(a));
59         rep(i, 0, n) rep(j, 0, n) scanf("%1d", &G[i][j]);
60         dijkstra(0);
61         ll ans = 1;
62         rep(i, 1, n) ans = (ans*a[i]) % MOD;
63         cout << ans << endl;
64     }
65     return 0;
66 }
posted @ 2017-07-21 10:28  Flowersea  阅读(215)  评论(0编辑  收藏  举报