Problem D. Dwarf Tower spfa
http://codeforces.com/gym/100269/attachments
首先建图,然后图中每条边的权值是会变化的,是由dis[x] + dis[y] ---> dis[make],然后就相当于新增加一个原点0,求0到1的最短距离
如果用了2更新4失败,但是2本来不是最优的,就是可以用7和8使得更优,那这样会不会漏掉最优解?答案是不会的,因为使用到7和8能更新2得时候,就会把2重新丢尽队列
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
const int maxn = 2e5 + ;
struct Edge {
int u, v, w, tonext;
}e[maxn * ];
int first[maxn], num;
void addEdge(int u, int v, int w) {
++num;
e[num].u = u, e[num].v = v, e[num].w = w, e[num].tonext = first[u];
first[u] = num;
}
LL dis[maxn];
int in[maxn], tim[maxn];
bool spfa(int bx, int n) { //从bx开始,有n个顶点
queue<int> que;
while (!que.empty()) que.pop();
for (int i = ; i <= n; ++i) {
que.push(i);
in[i] = true;
tim[i]++;
}
while (!que.empty()) {
int u = que.front();
if (tim[u] > n) return true; //入队次数超过n次,出现负环
que.pop(); //in[u] = false ?
for (int i = first[u]; i; i = e[i].tonext) {
if (dis[e[i].v] > dis[e[i].u] + dis[e[i].w]) {
dis[e[i].v] = dis[e[i].u] + dis[e[i].w];
if (!in[e[i].v]) { //不在队列
que.push(e[i].v);
in[e[i].v] = true;
tim[e[i].v]++;
}
}
}
in[u] = false;
}
return false;
} void work() {
int n, m;
cin >> n >> m;
for (int i = ; i <= n; ++i) {
cin >> dis[i];
}
for (int i = ; i <= m; ++i) {
int f, x, y;
cin >> f >> x >> y;
addEdge(x, f, y);
addEdge(y, f, x);
}
spfa(, n);
cout << dis[] << endl; } int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
freopen("dwarf.in", "r", stdin);
freopen("dwarf.out", "w", stdout);
IOS;
work();
return ;
}
也可以贪心。
每次都取一个权值最小的出来,因为那个已经不可能更小了,直接删除,然后更新其他。
用set维护。dp
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
struct Node {
LL cost, id;
bool operator < (const struct Node & rhs) const {
if (cost != rhs.cost) return cost < rhs.cost;
else return id < rhs.id;
}
Node(LL _cost, LL _id) {
cost = _cost, id = _id;
}
};
set<Node>ss;
const int maxn = 1e6 + ;
LL dp[maxn];
vector<pair<int, int> > vc[maxn];
int getid[maxn];
void work() {
int n, m;
cin >> n >> m;
for (int i = ; i <= n; ++i) {
int val;
cin >> val;
dp[i] = val;
ss.insert(Node(val, i));
}
for (int i = ; i <= m; ++i) {
int a, b, c;
cin >> a >> b >> c;
vc[c].push_back(make_pair(b, a));
vc[b].push_back(make_pair(c, a));
}
set<Node> :: iterator it;
while (!ss.empty()) {
it = ss.begin();
LL id = it->id;
LL cost = it->cost;
ss.erase(it);
for (int i = ; i < vc[id].size(); ++i) {
int an = vc[id][i].first, to = vc[id][i].second;
if (!ss.count(Node(dp[to], to))) {
continue;
}
ss.erase(Node(dp[to], to));
dp[to] = min(dp[to], cost + dp[an]);
ss.insert(Node(dp[to], to));
}
}
printf("%lld\n", dp[]);
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#else
freopen("dwarf.in","r",stdin);
freopen("dwarf.out","w",stdout);
#endif
work();
return ;
}
Problem D. Dwarf Tower spfa的更多相关文章
- Codeforces Gym 100269D Dwarf Tower spfa
Dwarf Tower 题目连接: http://codeforces.com/gym/100269/attachments Description Little Vasya is playing a ...
- noip模拟赛 dwarf tower
[问题描述]Vasya在玩一个叫做"Dwarf Tower"的游戏,这个游戏中有n个不同的物品,它们的编号为1到n.现在Vasya想得到编号为1的物品.获得一个物品有两种方式:1. ...
- dwarf tower
dwarf tower(dwarf.cpp/c/pas)[问题描述]Vasya在玩一个叫做"Dwarf Tower"的游戏,这个游戏中有n个不同的物品,它们的编号为1到n.现在Va ...
- D.Dwarf Tower
Vasya在玩一个叫做"Dwarf Tower"的游戏,这个游戏中有n个不同的物品, 它们的编号为1到n.现在Vasya想得到编号为1的物品. 获得一个物品有两种方式: 直接购买该 ...
- Codeforces Gym 100269 Dwarf Tower (最短路)
题目连接: http://codeforces.com/gym/100269/attachments Description Little Vasya is playing a new game na ...
- hdoj--3666--THE MATRIX PROBLEM(差分约束+SPFA深搜)
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HNU 12847 Dwarf Tower(最短路+队列优化)
题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12847 解题报告:有n样物品,编号从1到n第i样物品可以通过金 ...
- poj 1511(spfa)
---恢复内容开始--- http://poj.org/problem?id=1511 一个spfa类的模板水题. 题意:就是求从1到n个点的来回的所有距离和. 对spfa类的题还是不太熟练,感觉还是 ...
- BZOJ1233 [Usaco2009Open]干草堆tower 和 BZOJ3549 [ONTAK2010]Tower
题意 Problem 3549. -- [ONTAK2010]Tower 3549: [ONTAK2010]Tower Time Limit: 10 Sec Memory Limit: 64 MBS ...
随机推荐
- 洛谷【P3379】【模板】最近公共祖先(LCA)
浅谈\(RMQ\):https://www.cnblogs.com/AKMer/p/10128219.html 题目传送门:https://www.luogu.org/problemnew/show/ ...
- lvs-nat搭建httpd
拓扑图: #172.16.252.10 [root@~ localhost]#route -n Kernel IP routing table Destination Gateway Genmask ...
- 异常:Project configuration is not up-to-date with pom.xml解决方案
转自:https://www.cnblogs.com/zhujiabin/p/6343423.html 1. Description Resource Path Location ...
- redis-数据类型-string、hash、list、set、zset
String 类型操作string是redis最基本的类型,而且string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象. $redis-> ...
- Ubuntu Linux 使用桂电校园网 上网
2016年9月1日 星期四 桂电校园网今天升级新的出校器,旧的出校器已经不能使用,所以本篇博客已经过期,下面的方法已经不能让Ubuntu使用桂电校园网上外网了.详细的原因,请到这个网站查看:校园网计费 ...
- hbase-0.98.1-cdh5.1.0 完全分布式搭建
cdh版与0.98版的配置一样 1.环境 master:c1 slave:c2,c3 CentOS 6.5 x64 ,hadoop-2.3.0-cdh5.1.0,zookeeper-3.4.5-cdh ...
- Python最小二乘法解非线性超定方程组
求解非线性超定方程组,网上搜到的大多是线性方程组的最小二乘解法,对于非线性方程组无济于事. 这里分享一种方法:SciPy库的scipy.optimize.leastsq函数. import numpy ...
- 今年暑假不AC--贪心算法
Problem Description “今年暑假不AC?”“是的.”“那你干什么呢?”“看世界杯呀,笨蛋!”“@#$%^&*%...” 确实如此,世界杯来了,球迷的节日也来了,估计很多ACM ...
- BOX (UVA-1587) 比较代码书写上的差距
对比一下代码的书写差距: 我的代码: #include<iostream> using namespace std; ]; ]; ]; //访问标记 bool judge(int i, i ...
- Codeforces - 1181B - Split a Number - 贪心
https://codeforces.com/contest/1181/problem/B 从中间拆开然后用大数搞一波. 当时没想清楚奇偶是怎么弄,其实都可以,奇数长度字符串的中心就在len/2,偶数 ...