http://acm.hdu.edu.cn/showproblem.php?pid=1596
floyd 貌似超时 (代码转载)


dijkstra + heap优化
这题因为是不知道有多少个query 所以直接用dij 应该会更快


#include <stdio.h> #include <string.h> const int MAXN = 1010; double map[MAXN][MAXN], dis[MAXN]; bool set[MAXN]; int size = 0, heap[MAXN], pl[MAXN], n; void exchange(int a, int b) { int temp ; temp = heap[a], heap[a] = heap[b], heap[b] = temp; pl[heap[a]] = a, pl[heap[b]] = b; //attention~ 刚开始我是pl[heap[a]] = a, 弄反了 } void filterDown(int i) { if(i*2 <= size && (dis[heap[i]] < dis[heap[i*2]]) ) { exchange(i, i*2); filterDown(i*2); } if( i*2+1 <=size && (dis[heap[i]] < dis[heap[i*2+1]]) ) { exchange(i, i*2+1); filterDown(i*2+1); } }void filterUp(int i) { if( i/2 >=1 && (dis[heap[i]] > dis[heap[i/2]])) { exchange(i, i/2); filterUp(i/2); } } void insert(int i) { heap[++size] = i; pl[i] = size; filterUp(size); } void remove() { int index = heap[1]; exchange(1, size); size -- ; set[index] = 1; filterDown(1); for(int i=1; i<=n; i++) { if(!set[i] && dis[i] < map[index][i]*dis[index]) { dis[i] = map[index][i]*dis[index]; filterUp(pl[i]); } } } void dij(int src) { int i; memset(dis, 0, sizeof(dis)); memset(set, 0, sizeof(set)); size = 0; for(i=1; i<=n; i++) dis[i] = map[src][i]; for(i=1; i<=n; i++) insert(i); for(i=1; i<=n; i++) { remove(); } } int main() { int i, j, q, c1, c2; while(scanf("%d", &n)!=EOF) { size = 0; for(i=1; i<=n; i++) for(j=1; j<=n; j++) { scanf("%lf", &map[i][j]); } scanf("%d", &q); for(i=1; i<=q; i++) { scanf("%d %d", &c1, &c2); dij(c1); if(dis[c2]!=0) printf("%.3lf\n", dis[c2]); else printf("What a pity!\n"); } } }
这个是用stl 优先队列搞的dijkstra wa的代码 求解啊


#include <stdio.h> #include <string.h> #include <queue> using std::priority_queue; struct node { int u; double dis; bool operator < (node a) const { return dis > a.dis; } }; priority_queue<node> q; int vis[1005], n; double map[1005][1005], dis[1005]; double dij(int src, int ed) { int i; memset(vis, 0, sizeof(vis)); while(!q.empty()) q.pop(); for(i=1; i<=n; i++) dis[i] = 0; node a; a.dis = 1, a.u = src; q.push(a); dis[src] = 1; while(!q.empty()) { node now = q.top(); q.pop(); vis[now.u] = 1; if(now.u == ed) return now.dis; for(i=1; i<=n; i++) if(!vis[i] && dis[i] < dis[now.u] * map[now.u][i]) { dis[i] = dis[now.u]*map[now.u][i]; a.dis = dis[i]; a.u = i; q.push(a); } } return -1; } int main() { int i, j, q, c1, c2; while(scanf("%d", &n)!=EOF) { // size = 0; for(i=1; i<=n; i++) for(j=1; j<=n; j++) { scanf("%lf", &map[i][j]); } scanf("%d", &q); for(i=1; i<=q; i++) { scanf("%d %d", &c1, &c2); double res = dij(c1, c2); if(res != -1) printf("%.3lf\n", res); else printf("What a pity!\n"); } } return 0; }