【2017杭二联考】 图的有向环

P2555 - 【2017杭二联考】图的有向环

Description

题目背景: 
幻想乡的亡灵公主,西行寺幽幽子,在幻想乡很受欢迎,经常有妖怪来拜访她,但是幽 幽子并不喜欢被打扰,她希望从白玉楼出发,散步之后再回到白玉楼,同时路上遇到的妖怪 越少越好(有趣的是道路两边的妖怪数量并不相同,分别从两个方向经过同一条道路遇到的 妖怪数量是不同的)。当然,作为冥界的公主,她是不会重复经过同一条道路的。

问题描述: 
给定一个有 n 个点 m 条无向边的图,每条无向边最多只能经过一次。 
对于边(ui, vi), 从 ui 到 vi 的代价为 ai,从 vi 到 ui 的代价为 bi,其中 ai 和 bi 不一定相等。 求一个包 含 1 号点的有向环,使得环上代价之和最小。(保证图中没有重边和自环。)

Input

第一行两个个正整数 n,m,点数和边数。 
接下来 m 行,每行四个正整数,ui,vi,ai,bi。 
从 ui 到 vi 的代价为 ai,从 vi 到 ui 的代价为 bi 。

Output

输出一行,一个整数,如果有解输出最小代价,否则输出‘‘-1‘‘(不含引号)。

Sample Input

3 3 
1 2 4 3 
2 3 4 2 
1 3 1 1

Sample Output

6

Hint

数据范围: 
对于前 15% 的数据,3 <= n <= 20, 3 <= m <= 20 
对于前 30% 的数据,3 <= n <= 150, 3 <= m <= 2500 
对于前 70% 的数据,3 <= n <= 5000, 3 <= m <= 10^4 
对于 100% 的数据, 3 <= n <= 30000 , 3 <= m <= 10^5 , 1<=ui, vi <= n,1 <= ai, bi <= 10^4。 
保证图中没有重边,即不存在 i <> j,使得 ui = uj,vi = vj。 
保证图中没有自环,即 ui <> vi。

Source

图论,最短路

枚举与一号点相连的每一条边,再跑SPFA,min(枚举的边的长度+dis[1])即为答案,但是要注意剪枝和优化.

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<stack>
 9 #include<queue>
10 #include<map>
11 #define RG register
12 #define IL inline
13 #define pi acos(-1.0)
14 #define ll long long
15 using namespace std;
16 struct edge{
17   int first,nxt,to,w;
18 };
19 edge a[200050];
20 int n,m,num,minn;
21 int f[200050],dis[100050];
22 bool pan[100050];
23 void add(int l,int r,int w){
24   a[++num].to=r;
25   a[num].w=w;
26   a[num].nxt=a[l].first;
27   a[l].first=num;
28 }
29 inline void  spfa(int S,int w){
30   for(RG int i=1;i<=n;i++) dis[i]=999999999;
31   memset(pan,true,sizeof(pan));
32   queue <int> s;
33   s.push(S);
34   dis[S]=w;
35   while(!s.empty()){
36     int u=s.front();
37     s.pop();
38     pan[u]=true;
39     if(dis[u]>=minn) continue;
40     if(u==1) {minn=min(minn,dis[u]);continue;}
41     for(int i=a[u].first;i;i=a[i].nxt){
42       if(f[i]) continue;
43       int v=a[i].to;
44       if(dis[u]+a[i].w<dis[v]){
45     dis[v]=dis[u]+a[i].w;
46     if(pan[v]){
47       pan[v]=false;
48       s.push(v);
49     }
50       }
51     }
52   }
53 }
54 int main() {
55   scanf("%d%d",&n,&m);
56   for(int i=1;i<=m;i++){
57     int u,v,a,b;
58     scanf("%d%d%d%d",&u,&v,&a,&b);
59     add(u,v,a),add(v,u,b);
60   }
61   minn=999999999;
62   for(int i=a[1].first;i;i=a[i].nxt){
63     f[i]=1;
64     if(i%2==0) f[i-1]=1;
65     else f[i+1]=1;
66     spfa(a[i].to,a[i].w);
67     f[i]=0;
68     if(i%2==0) f[i-1]=0;
69     else f[i+1]=0;
70   }
71   if(minn==999999999)  printf("-1");
72   else  printf("%d",minn);
73   return 0;
74 }
时间: 2024-10-25 18:16:01

【2017杭二联考】 图的有向环的相关文章

【2017杭二联考】穿越矩形

P2554 - [2017杭二联考]穿越矩形 Description 题目背景: 幻想乡的创始人之一,八云紫,有着强大的控制结界的能力,可以瞬间消除一定范围内 所有弹幕.我们可以将其消除范围视为一个矩形,而弹幕可以视为动点. 八云紫想要嘲讽她的敌人,所以她希望只使用一次消除能力,尽可能多地消除弹幕. 请你告诉她,在哪一时刻使用道具,可以消除尽可能多的弹幕. 问题描述: 在平面上给定一个矩形区域(也可能退化成线段或者点). 矩形的边与坐标轴平行,左下端 点为 (xl,yl),右上端点为 (xr,y

2017.8.7 联考 就 贪心(有反悔策略)

[背景描述] 一排 N 个数, 第 i 个数是 Ai , 你要找出 K 个不相邻的数, 使得他们的和最大. 请求出这个最大和. [输入格式] 第一行两个整数 N 和 K. 接下来一行 N 个整数, 第 i 个整数表示 Ai . [输出格式] 一行一个整数表示最大和, 请注意答案可能会超过 int 范围 [样例输入] 3 2 4 5 3 [样例输出] 7 [数据范围] 对于 20% 的数据, N, K ≤ 20 . 对于 40% 的数据, N, K ≤ 1000 . 对于 60% 的数据, N,

2017.8.7 联考 期望的一个奇怪的题 书

Hazel有n本书,编号1为n到 ,叠成一堆.当她每次抽出一本书的时候,上方的书会因重力而下落,这本被取出的书则会被放置在书堆顶. 每次有pi的概率抽取编号为i的书.她每次抽书所消耗的体力与这本书在这堆中是第几本成正比.具体地,抽取堆顶的书所耗费体力值为1 ,抽取第二本耗费体力值为2 ,以此类推. 现在 想知道,在很久很久以后(可以认为几乎是无穷的),她每次抽书所耗费的体力的期望值是多少. 最终的答案显然可以表示成a/b的形式,请输出a*(b^-1)模1e9+7的值. [输入格式] 第一行一个整

2017.8.7 联考水题 Passward kmp/hash 字符串

你来到了一个庙前,庙牌上有一个仅包含小写字母的字符串 s. 传说打开庙门的密码是这个字符串的一个子串 t,并且 t 既是 s 的前缀又是 s 的后缀并且还在 s 的中间位置出现过一次. 如果存在这样的串,请你输出这个串,如有多个满足条件的串,输出最长的那一个. 如果不存在这样的串,输出"Just a legend"(去掉引号). 输入格式: 仅一行,字符串 s. 输出格式: 如题所述 样例输入 fixprefixsuffix 样例输出: fix 数据范围: 对于 60%的数据, s 的

「十二省联考 2019」字符串问题

「十二省联考 2019」字符串问题 解题思路 傻逼题.. 考虑问题转化为一个A串向其支配的所有B串的后缀A串连边,如果有环答案 \(-1\) 否则是这个 \(\text{DAG}\) 上最长路径,直接建图是 \(n^2\) 的,考虑优化建图即可. 由于 \(A,B\) 都是原串的一个子串,那么对原串的反串建 SAM,一个子串的后缀就是其所在节点上比它长的串以及,其子树里的所有串. 首先将所有 \(A,B\) 串在 SAM上用倍增定位并新建节点,把SAM上每个节点拆成入点和出点,对于SAM每一个节

P3746 [六省联考2017]组合数问题

P3746 [六省联考2017]组合数问题 \(dp_{i,j}\)表示前\(i\)个物品,取的物品模\(k\)等于\(r\),则\(dp_{i,j}=dp_{i-1,(j-1+k)%k}+dp_{i-1,j}\) \(dp_{i,0},dp_{i,1},dp_{i,2}.....dp_{i,k-1}\) \(\Longrightarrow\) \(dp_{i+1,0},dp_{i+1,1},dp_{i+1,2}.....dp_{i+1,k-1}\) 仔细想想,你能构造出矩阵的 #include

[luogu] P3745 [六省联考2017]期末考试 (贪心)

P3745 [六省联考2017]期末考试 题目描述 有 \(n\) 位同学,每位同学都参加了全部的 \(m\) 门课程的期末考试,都在焦急的等待成绩的公布. 第 \(i\) 位同学希望在第 \(t_i\)? 天或之前得知所有课程的成绩.如果在第 \(t_i\) 天,有至少一门课程的成绩没有公布,他就会等待最后公布成绩的课程公布成绩,每等待一天就会产生 \(C\) 不愉快度. 对于第 \(i\) 门课程,按照原本的计划,会在第 \(b_i\)? 天公布成绩. 有如下两种操作可以调整公布成绩的时间:

「十二省联考 2019」字符串问题 解题报告

「十二省联考 2019」字符串问题 当场就去世了,我这菜人改了一下午 考虑一个A,B之间的连边实际表示了两个A之间的有向边,然后把A的连边处理好,就转成了拓扑排序找环+最长链 但是边数很多,考虑优化连边 A,B之间的连边显然没法优化的,考虑一个B可以表示所有它的后缀A 把串反向建出SAM,然后一个B的后缀就是par树的子树 可以拿倍增定位 好了这题就没了 注意到一个事情,定位的点可能重复,于是对SAM拆点,每个点挂一个vector表示一个A或者B的点在SAM的这个位置 然后考虑如何连边 一个B所

今天,我们在这里加油:明天,我们将接续奋斗――鲁山二高高三年级举行联考、统考表彰大会

2019年11月4日上午八点,鲁山二高抚琴运动场,高三年级师生再次齐聚一堂,举行联考统考表彰大会. 时光如梭,匆匆而过,不知不觉,高三过去的日子已经近百.金太阳大联考.天一大联考.全市调研考试(一模)接踵而至.轮番上阵:周考午练.晨读晚诵按部就班,雷打不动.汗水浇灌希望,辛勤催熟硕果.在多次联考和统考中,同学们不惧强手,沉着发挥,获得了喜人的进步.今天的表彰活动既是对已过去的近百天拼搏过程的阶段性总结,也是为余下的二百余天后续征程补充信心与体力,再鼓劲头,接续奋斗! 表彰大会由学生资助中心主任.