最短路变形,求最长路即可。。。。
AC代码:
#include<iostream> #include<string.h> #include<cstdio> #include<string> #include<limits.h> #include<queue> #define N 1005 #define M 1000005 #define MIN -99999999 using namespace std; typedef struct node { int num; double len; int Next; friend bool operator<(node a,node b) {return a.len<b.len;} }Node; Node s[M]; int res,head[N],n,m; double dis[N]; bool vis[N]; void init() { res=0; memset(head,-1,sizeof(head)); memset(vis,false,sizeof(vis)); } void add(int a,int b,double c) { s[res].num=b; s[res].len=c; s[res].Next=head[a]; head[a]=res++; } void SPFA(int sta) { priority_queue<int>Q; Q.push(sta); vis[sta]=true; for(int i=1;i<=n;++i) dis[i]=(i==sta)?1:MIN; while(!Q.empty()) { int v=Q.top(); Q.pop(); vis[v]=false; for(int i=head[v];i!=-1;i=s[i].Next) { int u=s[i].num; double len=s[i].len; if(dis[v]*s[i].len>dis[u]) { dis[u]=dis[v]*s[i].len; if(!vis[u]) { vis[u]=true; Q.push(u); } } } } } int main() { while(~scanf("%d",&n)) { init(); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) { double a; scanf("%lf",&a); if(!a)continue; add(i,j,a); } scanf("%d",&m); for(int i=0;i!=m;++i) { int sta,end; scanf("%d%d",&sta,&end); SPFA(sta); if(dis[end]==MIN) printf("What a pity!\n"); else printf("%.3lf\n",dis[end]); } }return 0; }
dijstra+优先队列优化:
#include<iostream> #include<string.h> #include<cstdio> #include<string> #include<limits.h> #include<queue> #define N 1005 #define M 1000005 #define MIN -99999999 using namespace std; typedef pair<double,int> pii; typedef struct node { int num; double len; int Next; }Node; Node s[M]; int res,head[N],n,m; double dis[N]; void init() { res=0; memset(head,-1,sizeof(head)); } void add(int a,int b,double c) { s[res].num=b; s[res].len=c; s[res].Next=head[a]; head[a]=res++; } void Dijstra(int sta) { for(int i=1;i<=n;++i) dis[i]=(i==sta)?1:MIN; priority_queue<pii,vector<pii>,less<pii> >Q; Q.push(make_pair(dis[sta],sta)); while(!Q.empty()) { pii u=Q.top(); Q.pop(); int x=u.second; if(u.first!=dis[x]) continue; for(int i=head[x];i!=-1;i=s[i].Next) if(dis[s[i].num]<dis[x]*s[i].len) { dis[s[i].num]=dis[x]*s[i].len; Q.push(make_pair(dis[s[i].num],s[i].num)); } } } int main() { while(~scanf("%d",&n)) { init(); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) { double a; scanf("%lf",&a); if(!a)continue; add(i,j,a); } scanf("%d",&m); for(int i=0;i!=m;++i) { int sta,end; scanf("%d%d",&sta,&end); Dijstra(sta); if(dis[end]==MIN) printf("What a pity!\n"); else printf("%.3lf\n",dis[end]); } }return 0; }