zoj 1655 单源最短路 改为比例+最长路

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=655

没有理解清题意就硬套模板,所以WA了好几次,

解析看我的另一篇http://blog.csdn.net/u011026968/article/details/35579035

贴代码

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
#define ll long long

#define INF2 0x03F3F3F3F
#define INF 1.0
const int N=100+10;
int path[N];
bool vis[N];
double cost[N][N],lowcost[N],h[N];
double ans;
int n,m;
void Dij()
{
    int i,j,beg=0;
    double mmin;
    memset(vis,0,sizeof(vis));
    vis[beg]=1;
    for(i=0;i<n;i++)
    {
        lowcost[i]=cost[beg][i];path[i]=beg;
    }
    lowcost[beg]=0;
    path[beg]=-1;
    int pre=beg;
    for(i=1;i<n;i++)
    {
        mmin=-1;
        for(j=0;j<n;j++)
            if(vis[j] == 0 && lowcost[pre]*cost[pre][j]>lowcost[j])
            {
                lowcost[j]=lowcost[pre]*cost[pre][j];
                path[j]=pre;
            }
        for(j=0;j<n;j++)
            if(vis[j]==0 && lowcost[j]>mmin)
            {
                mmin=lowcost[j];
                pre=j;
            }
        vis[pre]=1;
    }
}

void Init()
{
    ans=0.0;
    for(int i=0;i<=n;i++)
        for(int j=0;j<=n;j++)
            cost[i][j]=-1,lowcost[i]=0;
}

void Addedge()
{

    int u,v;
    double tmp;
    h[0]=0;
    for(int i=1;i<n;i++)
        scanf("%lf",&h[i]);
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%lf",&u,&v,&tmp);
        if(u == n)u=0;
        if(v == n)v=0;
        if(cost[u][v]<1.0-tmp)//////////
        cost[u][v]=cost[v][u]=1.0-tmp;
    }
}
/*double dfs(int i,double ret)
{
    if(path[i])return dfs(path[i],ret)*cost[path[i]][i];
    return ret*cost[0][i];
}*/
int main()
{
    //freopen("zoj1655.txt","r",stdin);
    while(~scanf("%d%d",&n,&m))
    {
        Init();
        Addedge();
        Dij();
        for(int i=1;i<n;i++)
        {
            //ans+=dfs(i,h[i]);
            ans+=h[i]*1.0*lowcost[i];
        }
        printf("%.2lf\n",ans);
    }
    return 0;
}

zoj 1655 单源最短路 改为比例+最长路

时间: 2024-12-23 13:18:53

zoj 1655 单源最短路 改为比例+最长路的相关文章

单源最短路总结

动态更新中 先贴模板(吉林大学的模板) #define INF 0x03F3F3F3F const int N; int path[N], vis[N]; void Dijkstra(int cost[][N], int lowcost[N], int n, int beg){ int i, j, min; memset(vis, 0, sizeof(vis)); vis[beg] = 1; for (i=0; i<n; i++){ lowcost[i] = cost[beg][i]; path

POJ2253&amp;ZOJ1942--Frogger【SPFA】单源最短路变形

链接:http://poj.org/problem?id=2253 题意:一个青蛙在一块石头上,看到了另一个青蛙在另一块石头上,它想跳过去找它,如果距离太远它就需要借助别的石头当跳板,两块石头之间的青蛙距离被定义成两块石头之间所有路径中最大跳跃距离的最小值,求两个青蛙之间的青蛙距离. poj2263和它类似,链接:http://poj.org/problem?id=2263 解题报告:Here 这是最短路的变形,每两点之间都有路可以跳,更新最短路的值,权值记录成目前到这一点的最小青蛙距离就行了

【算法系列学习】Dijkstra单源最短路 [kuangbin带你飞]专题四 最短路练习 A - Til the Cows Come Home

https://vjudge.net/contest/66569#problem/A http://blog.csdn.net/wangjian8006/article/details/7871889 邻接矩阵实现的单源最短路 1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<algorithm> 6 #include

Dijkstra算法 --- 单源最短路

Dijkstra算法适用于边权值为正的情况,可用于计算正权图上的单元最短路. 其伪代码如下: 设d[v0] = 0, 其他d[i] = INF 循环n次{ 在所有未标号的结点中,选取d值最小的结点x 给结点x加上永久标号 对于从x出发的所有边,执行松弛操作. } //松弛操作的伪代码如下: RELAX(u,v,w) if(u.d + w(u,v) < v.d){ v.d = w.d + w(u,v); pre[v] = u; } Dijkstra算法代码: /* Dijkstra 单源最短路算法

常见模板(欧拉筛素数,最小生成树,快排,并查集,单源最短路)

欧拉筛素数: #include<cstdio> #define maxn 10000000+10 using namespace std; int n,prime[5000001],num_prime=0,m; bool if_prime[maxn]; void euler(int limit) { for(int i=2;i<=limit;i++) { if(!if_prime[i]) prime[++num_prime]=i; for(int j=1;prime[j]*i<=l

利用分支限界法求解单源最短路(Dijkstra)问题

分支限界法定义:采用BFS算法,并使用剪枝函数的算法称为分支界限法. 分支限界法解释:按广度优先的原则,有选择的在其child中进行扩展,从而舍弃不含有最优解的分支,不断重复这一过程,直到找到答案或者判定无解. 分支界限法常常用到优先队列来选择最佳扩展节点,有时也会用到普通队列,以先进先出为原则来进行筛选. 单源最短路问题定义:给定有向图和起点,寻找到达所有点的最短路径. 单源最短路的分支限界法概述:首先把节点加入优先队列,之后不断地从队列中取出最优扩展点,观察其可抵达的所有目标节点,若当前路径

UVA 658 It&#39;s not a Bug, it&#39;s a Feature! (单源最短路,dijkstra+优先队列,变形,经典)

题意:有n个bug,有m个补丁,每个补丁有一定的要求(比如某个bug必须存在,某个必须不存在,某些无所谓等等),打完出来后bug还可能变多了呢.但是打补丁是需要时间的,每个补丁耗时不同,那么问题来了:要打多久才能无bug?(同1补丁可重复打) 分析: n<=20,那么用位来表示bug的话有220=100万多一点.不用建图了,图实在太大了,用位图又不好玩.那么直接用隐式图搜索(在任意点,只要满足转移条件,任何状态都能转). 但是有没有可能每个状态都要搜1次啊?那可能是100万*100万啊,这样出题

单源最短路_SPFA_C++

当我们需要求一个点到其它所有点的最短路时,我们可以采用SPFA算法 代码特别好写,而且可以有环,但是不能有负权环,时间复杂度是O(α(n)n),n为边数,α(n)为n的反阿克曼函数,一般小于等于4 模板:http://www.cnblogs.com/hadilo/p/5934679.html 我感觉自己讲的不会很好,丢一个链接算了 算法详解:http://www.360doc.com/content/13/1208/22/14357424_335569176.shtml 伪代码是自己写的: 可以

HDU-4849 Wow! Such City! (单源最短路)

Problem Description Doge, tired of being a popular image on internet, is considering moving to another city for a new way of life. In his country there are N (2 ≤N≤ 1000) cities labeled 0 . . . N - 1. He is currently in city 0. Meanwhile, for each pa