题意:
在第一块石头到到第二块石头的通路中,每一条通路的元素都是这条通路中前后两个点的距离,这些距离中有一个最大距离,如果有多条通路,则求出所有通路的最大距离,并把这些最大距离作比较,把最小的一个最大距离输出。
dijkstra和spfa 写的 总感觉还是dijkstra比较好理解 。。。。。。 做了poj1797后 才发现 果然还是spfa最好用
spfa:
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int maxn = 101000, INF = 0xfffffff; int head[maxn],vis[maxn]; double d[maxn]; int n; struct tmp{ double x,y; }Tmp[maxn]; struct node{ int u,v,next; double d; }Node[maxn]; void add(int u,int v,double d,int i) { Node[i].u = u; Node[i].v = v; Node[i].d = d; Node[i].next = head[u]; head[u] = i; } void spfa(int s) { mem(vis,0); queue<int> Q; for(int i=0;i<=n;i++) d[i] = INF; d[s] = 0; Q.push(s); vis[s] = 1; while(!Q.empty()) { int x = Q.front();Q.pop(); vis[x] = 0; for(int i=head[x]; i!=-1; i=Node[i].next) { node e = Node[i]; if(d[e.v] > max(d[x],e.d)) { d[e.v] = max(d[x],e.d); if(!vis[e.v]) { Q.push(e.v); vis[e.v] = 1; } } } } } int main() { int ans = 0; while(cin>>n && n) { int cnt = 0; mem(head,-1); for(int i=1;i<=n;i++) { cin>>Tmp[i].x>>Tmp[i].y; } for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { add(i,j,sqrt((Tmp[i].x-Tmp[j].x)*(Tmp[i].x-Tmp[j].x) + (Tmp[i].y-Tmp[j].y)*(Tmp[i].y-Tmp[j].y)),cnt++); add(j,i,sqrt((Tmp[i].x-Tmp[j].x)*(Tmp[i].x-Tmp[j].x) + (Tmp[i].y-Tmp[j].y)*(Tmp[i].y-Tmp[j].y)),cnt++); } } spfa(1); printf("Scenario #%d\n",++ans); printf("Frog Distance = %.3f\n",d[2]); cout<<endl; } return 0; }
dijkstra:
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <queue> #include <cmath> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int maxn = 10010, INF = 0xfffffff; int n,m; int vis[maxn]; double d[maxn]; struct node2{ double x,y; }Node[maxn]; struct edge{ int u,v; double d; edge(int u,int v,double d) { this->u = u; this->v = v; this->d = d; } }; vector<edge> Edge; vector<int> G[maxn]; struct node{ int u; double d; node(double d,int u) { this->d = d; this->u = u; } bool operator < (const node& a) const { return d > a.d; } }; void add(int u,int v,double d) { Edge.push_back(edge(u,v,d)); G[u].push_back(Edge.size()-1); } void dijkstra(int s) { priority_queue<node> Q; for(int i=0;i<=n;i++) d[i] = INF; d[s] = 0; mem(vis,0); Q.push(node(0,s)); while(!Q.empty()) { node x = Q.top();Q.pop(); int u = x.u; if(vis[u]) continue; vis[u] = 1; for(int i=0;i<G[u].size();i++) { edge e = Edge[G[u][i]]; if(d[e.v] > max(d[u], e.d)) { d[e.v] = max(d[u], e.d); Q.push(node(d[e.v],e.v)); } } } } int main() { int cnt = 0; while(cin>>n && n) { for(int i=0;i<=n;i++) G[i].clear(); Edge.clear(); for(int i=1;i<=n;i++) { cin>>Node[i].x>>Node[i].y; } for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) { add(i,j,sqrt((Node[i].x-Node[j].x)*(Node[i].x-Node[j].x)+(Node[i].y-Node[j].y)*(Node[i].y-Node[j].y))); add(j,i,sqrt((Node[i].x-Node[j].x)*(Node[i].x-Node[j].x)+(Node[i].y-Node[j].y)*(Node[i].y-Node[j].y))); } dijkstra(1); printf("Scenario #%d\n",++cnt); printf("Frog Distance = %.3f\n",d[2]); cout<<endl; } return 0; }
Floyd:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #define mem(a,b) memset(a,b,sizeof(b)) using namespace std; const int maxn = 202, INF = 2000; struct edge{ double x,y; }Edge[maxn]; double d[maxn][maxn]; int main() { int n,cnt = 0; while(cin>>n && n) { for(int i=1;i<=n;i++) cin>>Edge[i].x>>Edge[i].y; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j] = d[j][i] = sqrt(pow(Edge[i].x-Edge[j].x,2)+pow(Edge[i].y-Edge[j].y,2)); for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j] = min(d[i][j],max(d[i][k],d[k][j])); printf("Scenario #%d\n",++cnt); printf("Frog Distance = %.3f\n",d[1][2]); cout<<endl; } return 0; }