UVA-10816 Travel in Desert (最小瓶颈最短路)

题目大意:给一张无向图,图中的每条边都有两个权值,长度d和热度r。找出从起点到终点的一条最大热度最小的路径,如果这样的路径有多条,选择一个最短的。

题目分析:如果只考虑最小的最大热度,那么本题就是一个最小瓶颈路问题,只需按照热度找一棵最小生成树即可。但是,如果这样的路径有多个,实际上是最小生成树有多个时,要找到最短路径,还得把热度不大于最小生成树中最大热度的边并且没在生成树中的边加到最小生成树中,然后再找最短路。

 

代码如下:

# include<iostream>
# include<cstdio>
# include<queue>
# include<cstring>
# include<algorithm>
using namespace std;
# define LL long long
# define REP(i,s,n) for(int i=s;i<n;++i)
# define CL(a,b) memset(a,b,sizeof(a))
# define CLL(a,b,n) fill(a,a+n,b)

const int N=105;
const int INF=1<<30;
const double inf=1e10;

struct Edge
{
    int fr,to;
    double d,r;
    bool operator < (const Edge &a) const {
        if(r==a.r) return d<a.d;
        return r<a.r;
    }
};
Edge e[N*100];
int n,m,fa[N],vis[N],pre[N];
double G[N][N],dis[N],ansr;

int findFa(int u)
{
    if(fa[u]!=u)
        return fa[u]=findFa(fa[u]);
    return u;
}

void kruskal(int s,int t)
{
    REP(i,0,n) fa[i]=i;
    REP(i,0,n) REP(j,0,n) G[i][j]=inf;
    REP(i,0,m){
        ansr=e[i].r;
        int fr=e[i].fr;
        int to=e[i].to;
        int u=findFa(fr);
        int v=findFa(to);
        if(u!=v)
            fa[u]=v;
        if(findFa(s)==findFa(t))
            break;
    }
    REP(i,0,m) if(e[i].r<=ansr)
        G[e[i].fr][e[i].to]=G[e[i].to][e[i].fr]=min(G[e[i].fr][e[i].to],e[i].d);
}

void dijkstra(int s)
{
    CLL(dis,inf,n);
    REP(i,0,n) pre[i]=i;
    dis[s]=0.0;
    queue<int>q;
    q.push(s);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=0;
        REP(i,0,n){
            if(dis[i]>dis[u]+G[u][i]){
                dis[i]=dis[u]+G[u][i];
                pre[i]=u;
                if(!vis[i]){
                    vis[i]=1;
                    q.push(i);
                }
            }
        }
    }
}

void print(int u)
{
    if(pre[u]==u){
        printf("%d",u+1);
    }else{
        print(pre[u]);
        printf(" %d",u+1);
    }
}

int main()
{
    int s,t;
    while(~scanf("%d%d",&n,&m))
    {
        scanf("%d%d",&s,&t);
        REP(i,0,m){
            cin>>e[i].fr>>e[i].to>>e[i].r>>e[i].d;
            --e[i].fr,--e[i].to;
        }
        sort(e,e+m);
        kruskal(s-1,t-1);
        dijkstra(s-1);
        print(t-1);
        printf("\n");
        printf("%.1lf %.1lf\n",dis[t-1],ansr);
    }
    return 0;
}

  

转载于:https://www.cnblogs.com/20143605--pcx/p/4930784.html

# 高校智慧校园解决方案摘要 智慧校园解决方案是针对高校信息化建设的核心工程,旨在通过物联网技术实现数字化校园的智能化升级。该方案通过融合计算机技术、网络通信技术、数据库技术和IC卡识别技术,初步实现了校园一卡通系统,进而通过人脸识别技术实现了更精准的校园安全管理、生活管理、教务管理和资源管理。 方案包括多个管理系统:智慧校园管理平台、一卡通卡务管理系统、一卡通人脸库管理平台、智能人脸识别消费管理系统、疫情防控管理系统、人脸识别无感识别管理系统、会议签到管理系统、人脸识别通道管理系统和图书馆对接管理系统。这些系统共同构成了智慧校园的信息化基础,通过统一数据库和操作平台,实现了数据共享和信息一致性。 智能人脸识别消费管理系统通过人脸识别终端,在无需接触的情况下快速完成消费支付过程,提升了校园服务效率。疫情防控管理系统利用热成像测温技术、视频智能分析等手段,实现了对校园人员体温监测和疫情信息实时上报,提高了校园公共卫生事件的预防和控制能力。 会议签到管理系统和人脸识别通道管理系统均基于人脸识别技术,实现了会议的快速签到和图书馆等场所的高效通行管理。与图书馆对接管理系统实现了一卡通系统与图书馆管理系统的无缝集成,提升了图书借阅的便捷性。 总体而言,该智慧校园解决方案通过集成的信息化管理系统,提升了校园管理的智能化水平,优化了校园生活体验,增强了校园安全,并提高了教学和科研的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值