http://acm.hdu.edu.cn/showproblem.php?pid=1596
1.队列优化的SPFA算法
#include <queue>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int Max = 1010;
typedef pair <double,int> pii;
int n,m,vis[Max];
double safe[Max],map[Max][Max];
void SPFA(int scr){///SPFA重复入队,用队列减少无用的松弛
for(int i=1; i<=n; i++)
safe[i] = 0, vis[i] = 0;
safe[scr] = 1,vis[scr] = 1;
queue <int> q;
q.push(scr);
while(!q.empty()){
int tmp = q.front();q.pop();
vis[tmp]=0;
for(int i=1; i<=n; i++){
if(safe[i] < safe[tmp] * map[tmp][i]){
safe[i] = safe[tmp] * map[tmp][i];
if(!vis[i]){
q.push(i);
vis[i] = 1;
}
}
}
}
}
int main(){
// freopen("in.txt", "r", stdin);
while(scanf("%d",&n) == 1 && n){
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
scanf("%lf",&map[i][j]);
}
}
scanf("%d",&m);
int from, to;
for(int i=0; i<m; i++){
scanf("%d%d",&from, &to);
SPFA(from);
if(!safe[to]) puts("What a pity!");
else printf("%.3lf\n",safe[to]);
}
}
return 0;
}
2.优先队列优化的dijkstra
#include <queue> #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int Max = 1010; typedef pair <double,int> pii; int n,m,vis[Max]; double safe[Max],map[Max][Max]; void dijkstra(int scr){///每一次贪心选择最优 for(int i=1; i<=n; i++) safe[i] = 0, vis[i] = 0; safe[scr] = 1; priority_queue <pii> q; q.push(make_pair(safe[scr], scr)); while(!q.empty()){ pii tmp = q.top();q.pop(); int from = tmp.second; // cout << from << endl; if(vis[from]) continue; vis[from]=1; for(int i=1; i<=n; i++){ if(safe[i] < safe[from] * map[from][i]){ safe[i] = safe[from] * map[from][i]; q.push(make_pair(safe[i], i)); } } } } int main(){ // freopen("in.txt", "r", stdin); while(scanf("%d",&n) == 1 && n){ for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ scanf("%lf",&map[i][j]); } } scanf("%d",&m); int from, to; for(int i=0; i<m; i++){ scanf("%d%d",&from, &to); dijkstra(from); if(!safe[to]) puts("What a pity!"); else printf("%.3lf\n",safe[to]); } } return 0; }