链接:
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 }