Poj 2253 Frogger
题目链接:http://poj.org/problem?id=2253
题意:给出两只青蛙的坐标A、B,和其他的n-2个坐标,求从起点到终点的所有路中最大边权的最小值
思路:Floyd变形:map[j][k]=min(map[j][k],max(map[j][i],map[i][k]));
#include <cstdio>
#include <cmath>
#define min(x,y) ((x)<(y)?(x):(y))
#define max(x,y) ((x)>(y)?(x):(y))
const int INF=0x3fffffff;
int map[205][205];
int n;
struct Point
{
int x,y;
void Get ()
{
scanf("%d%d",&x,&y);
}
}data[205];
int Cal_dis (Point a,Point b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
void Floyd ()
{
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
for (int k=1;k<=n;k++)
map[j][k]=min(map[j][k],max(map[j][i],map[i][k]));
}
int main ()
{
int Cas=1;
while (~scanf("%d",&n),n)
{
int i;
for (i=1;i<=n;i++)
data[i].Get();
for (i=1;i<=n;i++)
{
map[i][i]=INF;
for (int j=i+1;j<=n;j++)
map[i][j]=map[j][i]=Cal_dis(data[i],data[j]);
}
Floyd ();
printf("Scenario #%d\nFrog Distance = %.3lf\n\n",Cas++,sqrt(1.0*map[1][2]));
}
return 0;
}
题意:求s到t的可行路径上最小边权的最大值
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXPT = 1005;
const int MAXEG = 1000000*2+10;
const int INF = 0x5fffffff;
class SPFA
{
private:
int n,e;
int dis[MAXPT],head[MAXPT]; //dis[]源点到当前点的可行的最大载重量
bool visit[MAXPT];
struct Edge
{
int v,w,next;
Edge () {}
Edge (int _v, int _next, int _w)
{
v=_v;
next=_next;
w=_w;
}
}edges[MAXEG];
public:
void init (int vn)
{
n = vn;
e = 0;
for (int i=0;i<=n;i++)
{
head[i] = -1;
visit[i] = false;
dis[i] = INF; //注意这里赋值为正无穷
}
}
inline void Add (int u, int v, int w)
{
edges[e] = Edge(v,head[u],w);
head[u] = e++;
}
int spfa (int src, int des)
{
queue<int> que;
dis[src] = INF;
que.push(src);
visit[src] = true;
while (!que.empty())
{
int u = que.front();
que.pop();
visit[u] = false;
for (int i = head[u]; i != -1; i = edges[i].next)
{
int v = edges[i].v;
int k=(dis[u]<edges[i].w)?dis[u]:edges[i].w; //选择载重量小的
if (dis[v] == INF || dis[v]<k)
{
dis[v]=k;
if (visit[v]==false)
{
visit[v] = true;
que.push(v);
}
}
}
}
return dis[des];
}
}ob;
int main ()
{
#ifdef ONLINE_JUDGE
#else
freopen("read.txt","r",stdin);
#endif
int T,n,m;
scanf("%d",&T);
for (int Cas=1;Cas<=T;Cas++)
{
scanf("%d%d",&n,&m);
ob.init(n);
while (m--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
ob.Add(u,v,w);
ob.Add(v,u,w);
}
printf("Scenario #%d:\n%d\n",Cas,ob.spfa(1,n));
}
return 0;
}
Poj 1502 MPI Maelstrom
题意:求1到所有点最短距离的最大值
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
const int INF = 0x5fffffff; //权值上限
const int MAXPT = 102; //顶点数上限
const int MAXEG = 20002; //边数上限
//点存储1~n
class Dijkstra /*邻接表 + 优先队列 + Dijkstra求最短路*/
{
private:
int n,e;
int dis[MAXPT], head[MAXPT];
int visit[MAXPT];
struct Node
{
int v,dis;
Node () {}
Node (int _v,int _dis)
{
v=_v;
dis=_dis;
}
bool operator < (const Node a) const
{
return dis>a.dis;
}
};
struct Edge
{
int v, w, next;
Edge () {}
Edge (int _v, int _next, int _w)
{
v=_v;
next=_next;
w=_w;
}
}edges[MAXEG];
public:
inline void init (int vx)
{
n = vx;
e = 0;
memset(head,-1,sizeof(int) * (vx + 1));
}
inline void Add (int u, int v, int w)
{
edges[e] = Edge(v, head[u], w);
head[u] = e++;
}
void print ()
{
for (int i=1;i<=n;i++)
{
printf("%d: ", i);
for (int j=head[i]; j!=-1; j=edges[j].next)
printf(" %d", edges[j].v);
printf("\n");
}
}
void dijkstra (int src)
{
Node first, next;
priority_queue <Node> Q;
for (int i=0;i<=n;i++)
{
dis[i] = INF;
visit[i] = false;
}
dis[src]=0;
Q.push (Node(src, 0));
while (!Q.empty())
{
first = Q.top();
Q.pop();
visit[first.v] = true;
for (int i=head[first.v] ; i!=-1 ; i=edges[i].next)
{
if (visit[edges[i].v])
continue;
next = Node(edges[i].v, first.dis + edges[i].w);
if (next.dis < dis[next.v])
{
dis[next.v] = next.dis;
Q.push(next);
}
}
}
}
int Deal ()
{
dijkstra (1);
int ans=-1;
for (int i=2;i<=n;i++)
ans=max(ans,dis[i]);
return ans;
}
}ob;
int main ()
{
int n;
char str[4];
while (~scanf("%d",&n))
{
ob.init(n);
int i,j,temp;
for (i=2;i<=n;i++)
for (j=1;j<i;j++)
{
scanf("%s",str);
if (str[0]=='x')
continue;
sscanf(str,"%d",&temp);
ob.Add(i,j,temp);
ob.Add(j,i,temp);
}
printf("%d\n",ob.Deal());
}
return 0;
}