[LuoguP2269][HNOI2002]高质量的数据传输

来一发Dijkstra的写法(含详细注释)。

题目要求丢失率最小的情况下使得时延最短,这样图的边就有了两个属性。

但这并不能掩盖它还是一道不折不扣的单源最短路的模板的事实,仅仅是多了一个优先级罢了,松弛时再加一个判断就行了。

然后。。。然后就没有了啊。。哦,再提醒几点:

  • 这里的Dijkstra不需要加堆优化。因为朴素的Dijkstra\(O(n^2)\)的,可以直接过。

  • 我们为了方便,并不直接计算丢失率,而是用保留率代替之。具体操作见下方代码。

  • 注意要用double

/*This code is written by _Wallace_.*/
/*Update time : 2020/02/06 21:00*/

#include
#include
using namespace std;

const int N=205;
int n,s,t;
int tc[N][N];//时延 (time cost) 
double lr[N][N];//丢失率 (loss rate)

namespace SSSP
{
    int Time[N];//时延 
    double Left[N];//保留率 
    bool Book[N];//是否更新过 
    
    void Dijkstra()
    {
        for(register int i=0;i<=n;i++)
            Book[i]=false,Time[i]=1e9,Left[i]=0;
        Time[s]=0,Left[s]=1;//初始化 
        
        while(true)//一张循坏,直到没有点可以更新为止 
        {
            int nxt=0;
            for(register int i=1;i<=n;i++)//选取一个最当前最优(保留率最大,其次为时延最小)的点 
                if(!Book[i])//不能选更新过的点 
                    if(Left[nxt]Time[i]) nxt=i;
                    //保留率一样的话,如果时延更小那也是要换掉的。 
            if(nxt==0) break;
            //没有点可以更新为止,退出 
            Book[nxt]=true;//标记更新 
            for(register int i=1;i<=n;i++)
            {
                if(i==nxt) continue;
                if(tc[nxt][i]==-1||lr[nxt][i]==-1) continue;
                //枚举出选中点的所有相邻的点 
                if(Left[i]Time[nxt]+tc[nxt][i])//保留率一样,但如果时延小了 
                {//也要更新 
                    Left[i]=Left[nxt]*(1.0-lr[nxt][i]);
                    Time[i]=Time[nxt]+tc[nxt][i];//两个属性一个也不能落下
                }
            }
        }
        
        printf("%d %.4f\n",Time[t],1.0-Left[t]);
        return;//输出答案 ,注意Left是保留率,输出时应为丢失率=1-保留率。
    }
}

signed main()
{
    scanf("%d%d%d",&n,&s,&t);
    for(register int i=1;i<=n;i++)//读入时延 
        for(register int j=1;j<=n;j++)
            scanf("%d",&tc[i][j]);
    for(register int i=1;i<=n;i++)//读入丢失率 
        for(register int j=1;j<=n;j++)
            scanf("%lf",&lr[i][j]);
    SSSP::Dijkstra();//开始Dijkstra算法 
    return 0;
}

完结撒花~

留个赞叭QwQ

你可能感兴趣的:([LuoguP2269][HNOI2002]高质量的数据传输)