hdu_1596
来源:互联网 发布:cms报价 编辑:程序博客网 时间:2024/05/12 16:06
//最短路,只不过这里是乘法,和加法做法一样//这题精度不强#include <cstdio>#include <cstring>#include <queue>#include <algorithm>using namespace std;#define MAXN 1001#define INF 0x3f3f3f3fint in_queue[MAXN];double dis[MAXN], each_dis[MAXN][MAXN], ans;double spfa(int src, int des, int vertex){ int u, v; queue<double> q; memset(dis, 0, sizeof(dis)); memset(in_queue, 0, sizeof(in_queue)); q.push(src); in_queue[src] = 1; while( !q.empty() ) { u = q.front(); q.pop(); in_queue[u] = 0; for(v = 1; v <= vertex; v ++) { if( 0.0 == each_dis[u][v] ) { continue; } if( dis[v] < ((0.0 == dis[u])?1 : dis[u])*each_dis[u][v] ) { dis[v] = ((0.0 == dis[u])?1 : dis[u])*each_dis[u][v]; if( !in_queue[v] ) { q.push(v); } } } } return (0.0 == dis[des])? -1 : dis[des];}int main(int argc, char const *argv[]){#ifndef ONLINE_JUDGE freopen("test.in", "r", stdin);#endif int vertex, ask, u, v; while( ~scanf("%d", &vertex) ) { memset(dis, 0, sizeof(dis)); for(int i = 1; i <= vertex; i ++) { for(int j = 1; j <= vertex; j ++) { scanf("%lf", &each_dis[i][j]); } } scanf("%d", &ask); for( ; ask; ask --) { scanf("%d %d", &u, &v); ans = spfa(u, v, vertex); if( -1.0 == ans ) { printf("What a pity!\n"); } else { printf("%.3lf\n", ans); } } } return 0;}