简述题意: 给定一个有向图,对于连接同两个点的边算作同一条,问不经过重复边的最小正权环。

保证没有重边(这个是指有向的),没有自环。

算法:最短路+构造

难度:NOIP+

题解:

有一种暴力的思路,感觉还不错,给大家说一下吧。

暴力:

首先介绍一个容易发现的性质,->从1号点开始spfa,回到点1’,发生重复走的边一定是直接与1相连的边。

这样的话,我们每次只需要枚举每一个与1相连的边是哪条,然后删掉它的"反向边",然后最短路跑回来。

于是菊花图横空出世,这个暴力做法完美TLE。

正解:

请见黄学长博客,黄学长描述的再清楚不过了!!!

代码如下(仿hzwer):

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#define ll long long
#define N 100005
using namespace std;
struct node
{int next;int to;int val;
}edg[N<<1];
int hea[N],cnt=1;
void init()
{memset(hea,-1,sizeof(hea));cnt=1;
}
void add(int u,int v,int w)
{edg[cnt].next=hea[u];edg[cnt].to=v;edg[cnt].val=w;hea[u]=cnt++;
}
struct no
{int d;int po;
};
bool operator < (no x,no y)
{return x.d>y.d;
}
int dis[N],vis[N];
int p[N];
int n,m;
void dij(int rt)
{memset(dis,0x3f3f3f3f,sizeof(dis));priority_queue<no>Q;no temp;temp.po=rt;temp.d=0;dis[rt]=0;Q.push(temp);while(!Q.empty()){temp=Q.top();Q.pop();int u=temp.po;if(vis[u]) continue;vis[u]=1;for(int i = hea[u];i != -1;i=edg[i].next){int to=edg[i].to;if(vis[to]) continue;if(dis[to]>dis[u]+edg[i].val){if(u==1) p[to]=to;else p[to]=p[u];dis[to]=dis[u]+edg[i].val;no point;point.po=to;point.d=dis[to];Q.push(point);}}}
}
int a[N<<1],b[N<<1],c[N<<1];
int tot,T;
void ins(int x,int y,int w)
{a[++tot]=x,b[tot]=y,c[tot]=w;
}
void rb()
{for(int x = 1;x <= n;x++){for(int i = hea[x];i != -1;i = edg[i].next){if(edg[i].to==1){if(p[x]!=x)ins(1,T,dis[x]+edg[i].val);else ins(x,T,edg[i].val);}if(x==1){if(p[edg[i].to]!=edg[i].to)ins(1,edg[i].to,edg[i].val);}if(edg[i].to!=1&&x!=1){if(p[x]!=p[edg[i].to])ins(1,edg[i].to,dis[x]+edg[i].val);else ins(x,edg[i].to,edg[i].val);}}}init();memset(vis,0,sizeof(vis)); for(int i = 1;i <= tot;i++) add(a[i],b[i],c[i]);
}
int main()
{scanf("%d%d",&n,&m);init();for(int i = 1;i <= m;i++){int x,y,w,ww;scanf("%d%d%d%d",&x,&y,&w,&ww);add(x,y,w),add(y,x,ww);}dij(1);T=n+1;rb();dij(1);if(dis[T]==0x3f3f3f3f) puts("-1");else printf("%d\n",dis[T]); return 0 ;
}

bzoj 4398: 福慧双修(最短路建模/构造)相关推荐

  1. bzoj 4398 福慧双修 —— 二进制分组+多起点最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 按二进制每一位是 0/1 把 1 号点的儿子分成两组,分别作为起点和终点跑多起点最短路 ...

  2. BZOJ 2407: 探险/BZOJ 4398: 福慧双修 dijkstra 构造

    2407: 探险 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 170  Solved: 95 [Submit][Status][Discuss] ...

  3. bzoj 4398 福慧双修——二进制分组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 如果枚举1号点走哪些点出去,就从那些点出发跑多源最短路即可.最短路不会重复经过一条边. ...

  4. bzoj 4398 福慧双修 题解

    卡了一晚上啊 首先我们要跑一边整张图的spfa,记录每个点是从哪条边出去的(pre数组) 这里记录的不是前驱边,而是和原点相连的第一个点编号,因为不能走重复边所以才要记录这个,以免刚刚出去又原路返回 ...

  5. ACM一类方程问题的求解[最短路建模] bzoj2118

    在ACM生涯里已经预见两回判断这种方程是否有解.有几个解的问题了. 例如: 1 给定非负整数a,b,c,n,请判断ax+by+cz=n是否存在(x,y,z)均为非负整数的解 题目链接:http://o ...

  6. 字符串——BZOJ 3097: Hash Killer I【构造题,思维题】

    BZOJ 3097: Hash Killer I[构造题,思维题] 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3097 题意:让你出一组 ...

  7. bzoj 2118 墨墨的等式 - 图论最短路建模

    墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+-+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. Input ...

  8. bzoj 4398:福慧双修

    学习了一下最短路的姿势,这个建图方法好妙啊,虽然不会证明正确性-- #include <bits/stdc++.h> #define N 220000 #define INF 100000 ...

  9. BZOJ 2407: 探险/4398: 福慧双修

    2407: 探险 Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明 ...

最新文章

  1. Eclipse中git检出、更新、提交、合并分支、以及解决冲突
  2. android中的Json一
  3. [crypto]-53-openssl命令行的使用(aes/rsa签名校验/rsa加密解密/hmac)
  4. ABAP并发计算的一个实例
  5. 为什么font-family最后都会加上sans-serif字体?
  6. PHP的ISAPI和FastCGI比较
  7. Github:视觉问答最新资源汇总
  8. javascript amp;amp; 和 || 最清晰的描述
  9. 基于Socket网络编程
  10. 行为型模式——模板方法模式
  11. Linux的LCD驱动
  12. Oracle Exadata 技术详解 - 李亚
  13. POI合并单元格后设置边框
  14. 裂变活动的5个关键步骤?
  15. 数据有效性跨表引用的解决
  16. P3324 [SDOI2015]星际战争二分答案+网络流
  17. java后端生成图形验证码、前端接收并展示
  18. c语言字符结构数组初始化,C语言结构体数组初始化问题
  19. 【STM32 x ESP8266】连接阿里云 MQTT 服务器(报文连接)
  20. 聪明人做生意,打折也能玩出新鲜感!让顾客觉得现在不买就是亏!

热门文章

  1. 绘图---PS使用教程总结(一)基本操作
  2. 谷歌Pixel 4神奇在哪儿? AI黑科技带来四大改变!
  3. 地理信息系统:利用ArcGIS制作校园地图
  4. 读书笔记 - I heart logs
  5. 腾讯拿下基金销售牌照:微信、蚂蚁、东方财富上演“三国杀”
  6. C语言_指针动态内存分布
  7. Java 根据高德地图获取经纬度坐标
  8. 实现一个简单的登录页面
  9. CSS精灵图及字体图标
  10. 华南师大教授/教育学博士焦建利力荐《正在爆发的互联网革命》