题意及思路:https://blog.csdn.net/yzyyylx/article/details/90145400

这题主要巧妙在分析了最短路算法的性质,得出大小小于等于3的连通块一定不会被再次访问的结论。

代码:

#include <bits/stdc++.h>
using namespace std;
bool v[80][1 << 18];
int dp[80][1 << 18];
const int maxn = 1010;
struct node {
int dis, state, now;
bool operator < (const node& rhs) const {
return dis > rhs.dis;
}
};
struct Edge {
int v, w;
};
vector<Edge> G[maxn];
int sz[maxn], num[maxn], ans[maxn];
int A, B, n, m, tot;
void add(int x, int y, int z) {
G[x].push_back((Edge){y, z});
G[y].push_back((Edge){x, z});
}
priority_queue<node> q;
int f[maxn];
int get(int x) {
if(x == f[x]) return x;
return f[x] = get(f[x]);
}
void merge(int x, int y) {
int x1 = get(x), y1 = get(y);
if(x1 == y1) return;
f[x1] = y1;
sz[y1] += sz[x1];
}
int get_num(int x) {
if(sz[get(x)] > 3)
return 1 << num[get(x)];
else
return 0;
}
void dijkstra() {
memset(dp, 0x3f, sizeof(dp));
memset(ans, 0x3f, sizeof(ans));
q.push((node){0, get_num(1), 1});
dp[1][get_num(1)] = 0;
while(!q.empty()) {
node tmp = q.top();
q.pop();
if(v[tmp.now][tmp.state]) continue;
v[tmp.now][tmp.state] = 1;
ans[tmp.now] = min(ans[tmp.now], tmp.dis);
for (auto x : G[tmp.now]) {
if(x.w == B && get(x.v) == get(tmp.now)) continue;
if(x.w == B && (tmp.state & get_num(x.v))!= 0) continue;
if(x.w + tmp.dis < dp[x.v][get_num(x.v) | tmp.state]) {
dp[x.v][get_num(x.v) | tmp.state] = x.w + tmp.dis;
q.push((node){dp[x.v][get_num(x.v) | tmp.state], get_num(x.v) | tmp.state, x.v});
}
}
}
}
int main() {
int x, y, z;
scanf("%d%d%d%d", &n, &m, &A, &B);
for (int i = 1; i <= n; i++) {
f[i] = i;
sz[i] = 1;
}
for (int i = 1; i <= m; i++) {
scanf("%d%d%d", &x, &y, &z);
add(x, y, z);
if(z == A) {
merge(x, y);
}
}
for (int i = 1; i <= n; i++) {
if(i == get(i) && sz[i] > 3) {
num[i] = tot++;
}
}
dijkstra();
for (int i = 1; i <= n; i++)
printf("%d ", ans[i]);
}

  

Codeforces 1149D 最短路 状压DP的更多相关文章

  1. codeforces Diagrams & Tableaux1 (状压DP)

    http://codeforces.com/gym/100405 D题 题在pdf里 codeforces.com/gym/100405/attachments/download/2331/20132 ...

  2. HDU 4568 Hunter 最短路+状压DP

    题意:给一个n*m的格子,格子中有一些数,如果是正整数则为到此格子的花费,如果为-1表示此格子不可到,现在给k个宝藏的地点(k<=13),求一个人从边界外一点进入整个棋盘,然后拿走所有能拿走的宝 ...

  3. codeforces 21D. Traveling Graph 状压dp

    题目链接 题目大意: 给一个无向图, n个点m条边, 每条边有权值, 问你从1出发, 每条边至少走一次, 最终回到点1. 所走的距离最短是多少. 如果这个图是一个欧拉回路, 即所有点的度数为偶数. 那 ...

  4. 最短路+状压DP【洛谷P3489】 [POI2009]WIE-Hexer

    P3489 [POI2009]WIE-Hexer 大陆上有n个村庄,m条双向道路,p种怪物,k个铁匠,每个铁匠会居住在一个村庄里,你到了那个村庄后可以让他给你打造剑,每个铁匠打造的剑都可以对付一些特定 ...

  5. 【BZOJ1097】[POI2007]旅游景点atr 最短路+状压DP

    [BZOJ1097][POI2007]旅游景点atr Description FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺 ...

  6. HDU3247 Resource Archiver —— AC自动机 + BFS最短路 + 状压DP

    题目链接:https://vjudge.net/problem/HDU-3247 Resource Archiver Time Limit: 20000/10000 MS (Java/Others)  ...

  7. hdu3247Resource Archiver (AC自动机+最短路+状压dp)

    Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others) Total Submis ...

  8. Codeforces 917C - Pollywog(状压 dp+矩阵优化)

    UPD 2021.4.9:修了个 typo,为啥写题解老出现 typo 啊( Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1C,不过还是被我想出来了 u1 ...

  9. Codeforces 79D - Password(状压 dp+差分转化)

    Codeforces 题目传送门 & 洛谷题目传送门 一个远古场的 *2800,在现在看来大概 *2600 左右罢( 不过我写这篇题解的原因大概是因为这题教会了我一个套路罢( 首先注意到每次翻 ...

随机推荐

  1. Jmeter接口压力测试(先登录再测接口)

    Jmeter测试接口(包括登陆操作) 1.      创建HTTP Request先登录 参考: http://blog.csdn.net/ab_2016/article/details/782496 ...

  2. Es学习第二课, ES安装和客户端使用

    Elasticsearch安装依赖于jdk,所以大家先保证自己电脑安装好Java环境(JDK7或更高版本),并配置好环境变量:这块的配置我就不细讲了,不管是Linux还是Windows,这块的安装和配 ...

  3. python 在图像上写中文字体 (python write Chinese in image)

    本人处理图像的时候经常使用opencv的包,但是 cv2.putText 显示不了中文,所以查找了如何在python在图像上写中文的方法,在伟大的Stack Overflow上面找到一个方法,分享给大 ...

  4. 卸载Anaconda

    conda install anaconda-clean anaconda-clean --yes Anaconda 安装的时候在 .bash_profile中添加了变量: export PATH=& ...

  5. Vue select 绑定动态变量

    概述 根据后台的数据生成多个select,由于数据的数量不定,所以v-model绑定的变量名也不定.所以通过数据的id或者下标进行变量拼接.页面能够成功渲染,但是当进行下拉框的选值时,组件不刷新,选中 ...

  6. ajax中回调的几个坑

    在前端开发中,经常要用ajax去拿后台接口返回的数据,总结几个ajax的回调的常见问题,供大家参考爬坑. 未定义contentType,可能会造成的传入后台的数据乱码,可以加上如下代码在ajax请求中 ...

  7. 2018icpc沈阳/gym101955 J How Much Memory Your Code Is Using? 签到

    题意: 给你定义一堆变量,计算一下这些变量共占了多少k内存. 题解: 按题意模拟即可,善用ceil() // // Created by melon on 2019/10/22. // #includ ...

  8. JS-模拟printf

    function printf(){ var args = [].slice.call(arguments), fmt = args.shift(), args_index = 0; ///%(填充的 ...

  9. 实验吧关于隐写术的writeUp(一)

    0x01 Spamcarver 原题链接 http://www.shiyanbar.com/ctf/2002 1.用Hex workshop打开图片,图片的开头是 FF D8 ,这是jpeg格式的文件 ...

  10. js 中常用的设计模式

    常用的设计模式: 工厂方法模式.单例模式.适配器模式.组合模式.迭代子模式 (23种设计模式) 总体来说设计模式分为三大类: ①创建型模式 共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原 ...