POJ 1135 Domino Effect (spfa + 枚举)- from lanshui_Yang(二)

2014-11-23 21:38:14 · 作者: · 浏览: 8
] = true ; d[u] = 0 ; int tmp ; Node v ; while (!q.empty()) { tmp = q.front() ; q.pop() ; inq[tmp] = false ; int i ; for(i = 0 ; i < vert[tmp].size() ; i ++) { v = vert[tmp][i] ; if(d[tmp] != INF && d[tmp] + v.dis < d[v.adj]) { d[v.adj] = d[tmp] + v.dis ; if(!inq[v.adj]) { q.push(v.adj) ; inq[v.adj] = true ; } } } } } void solve() { memset(inq , 0 , sizeof(inq)) ; int i , j ; for(i = 1 ; i <= n ; i ++) { d[i] = INF ; } spfa(1) ; double MAX = d[1] ; int MAXb = 1 ; for(i = 1 ; i <= n ; i ++) { if(MAX < d[i]) { MAX = d[i] ; MAXb = i ; } } int pan = 0 ; int t1 , t2 ; for(i = 1 ; i <= n ; i ++) // 枚举每条边 , 更新MAX { for(j = 0 ; j < vert[i].size() ; j ++) { Node tn = vert[i][j] ; int ta = tn.adj ; double td = tn.dis ; if((d[i] + d[ta] + td) / 2 >
MAX ) // 注意:最大距离的求法 { pan = 1 ; MAX = (d[i] + d[ta] + td) / 2; if(i < ta) { t1 = i ; t2 = ta ; } else { t1 = ta ; t2 = i ; } } } } printf("The last domino falls after %.1f seconds," , MAX) ; if(pan) { printf(" between key dominoes %d and %d.\n" , t1 , t2) ; } else { printf(" at key domino %d.\n" , MAXb) ; } puts("") ; } int ca ; int main() { ca = 0 ; while (scanf("%d%d" , &n , &m) != EOF) { if(n == 0 && m == 0) break ; init() ; printf("System #%d\n" , ++ ca) ; solve() ; } return 0 ; }