Highway Project (ZOJ - 3946,双权值 spfa)

2024-03-30 14:08

本文主要是介绍Highway Project (ZOJ - 3946,双权值 spfa),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.题目链接:

ZOJ-3946

二.题目大意:

T 组数据.

第一行两个整数 n,m   1\leq N,\ M \leq 10^{5}

之后 m 行数据,每行给出第 i 条路的 {起点,终点,花费时间,花费金钱}

首都为第 0 号城市.

求从首都到其他所有城市所需的 总时间 和 总建路花费.

三.分析:

双权值的单源最短路,更改 if 条件语句里就可以了.

注意:时间可重复加,但花费不可以.

所以直接用 dis2[v] 来记录第 i 条路的花费

之后求和即可.

还有要开 long long int.

详见代码.

四.分析:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-6
#define pi acos(-1.0)
#define ll long long int
using namespace std;const int M = (int)1e5;
const ll inf = 1ll << 50;struct node
{int u;int v;int c1;int c2;int next;
}Edge[2 * M + 5];int cnt = 0;
bool vis[M + 5];
int head[M + 5];
ll dis1[M + 5];
ll dis2[M + 5];void init(int n)
{cnt = 0;for(int i = 0; i < n; ++i){vis[i] = 0;head[i] = -1;dis1[i] = inf;dis2[i] = inf;}
}void add(int u, int v, int c1, int c2)
{Edge[cnt].u = u;Edge[cnt].v = v;Edge[cnt].c1 = c1;Edge[cnt].c2 = c2;Edge[cnt].next = head[u];head[u] = cnt++;
}struct cmp
{bool operator()(int a, int b){if(dis1[a] == dis1[b])return dis2[a] > dis2[b];return dis1[a] > dis1[b];}
};void spfa(int start)
{vis[start] = 1;dis1[start] = 0;dis2[start] = 0;priority_queue <int, vector <int>, cmp> q;q.push(start);while(!q.empty()){ll u = q.top();q.pop();vis[u] = 0;for(int i = head[u]; ~i; i = Edge[i].next){int v = Edge[i].v;if(dis1[v] >= dis1[u] + Edge[i].c1){if(dis1[v] == dis1[u] + Edge[i].c1)dis2[v] = min(dis2[v], 1ll * Edge[i].c2);elsedis2[v] = 1ll * Edge[i].c2;dis1[v] = dis1[u] + Edge[i].c1;if(!vis[v]){vis[v] = 1;q.push(v);}}}}
}int main()
{int T;scanf("%d", &T);while(T--){int n, m;scanf("%d %d", &n , &m);init(n);for(ll i = 0; i < m; ++i){ll u, v, c1, c2;scanf("%d %d %d %d", &u, &v, &c1, &c2);add(u, v, c1, c2);add(v, u, c1, c2);}spfa(0);ll sum1 = 0;ll sum2 = 0;for(int i = 0; i < n; ++i){sum1 += dis1[i];sum2 += dis2[i];}printf("%lld %lld\n", sum1, sum2);}return 0;
}

 

 

这篇关于Highway Project (ZOJ - 3946,双权值 spfa)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/861696

相关文章

poj 1511 Invitation Cards(spfa最短路)

题意是给你点与点之间的距离,求来回到点1的最短路中的边权和。 因为边很大,不能用原来的dijkstra什么的,所以用spfa来做。并且注意要用long long int 来存储。 稍微改了一下学长的模板。 stack stl 实现代码: #include<stdio.h>#include<stack>using namespace std;const int M

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include

poj 3255 次短路(第k短路) A* + spfa 或 dijkstra

题意: 给一张无向图,求从1到n的次短路。 解析: A* + spfa 或者 dijkstra。 详解见上一题:http://blog.csdn.net/u013508213/article/details/46400189 本题,spfa中,stack超时,queue的效率最高,priority_queue次之。 代码: #include <iostream>#i

poj 2449 第k短路 A* + spfa

poj 2449: 题意: 给一张有向图,求第k短路。 解析: A* + spfa。 一下转自:http://blog.csdn.net/mbxc816/article/details/7197228 “描述一下怎样用启发式搜索来解决K短路。 首先我们知道A*的基础公式:f(x)=g(x)+h(x);对h(x)进行设计,根据定义h(x)为当前的x点到目标点t所需要的实际距

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

zoj 4624

题目分析:有两排灯,每排n个,每个灯亮的概率为p,每个灯之间互不影响,亮了的灯不再灭,问两排中,每排有大于等于m个灯亮的概率。 设dp[ i ][ j ]为第一排亮了i个灯,第二排亮了j个灯,距离目标状态的期望天数。显然 i >= m ,j >= m时 , dp[ i ][ j ] = 0 。 状态转移 : 第一排亮了a个灯,a 在[ 0 , n - i] 之间,第二排亮了b个灯 , b 在

zoj 3228 ac自动机

给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次。单词前面为0表示这个单词可重叠出现,1为不可重叠出现。 Sample Input ab 2 0 ab 1 ab abababac 2 0 aba 1 aba abcdefghijklmnopqrstuvwxyz 3 0 abc 1 def 1 jmn Sample Output Case 1 1 1 Case 2

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g