Poj 2253 + 1797 + 1502 最短路的最小最大值问题

本文深入解析了信息技术领域的核心技术和应用场景,包括但不限于前端开发、后端开发、移动开发、游戏开发、大数据开发等细分领域。通过详细阐述每个领域的关键技术、实践案例以及最新发展趋势,旨在为读者提供全面的技术视野和行业洞察。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}


Poj 1797 Heavy Transportation

题意:求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; 
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值