社区讨论
关于全负权图最短路
学术版参与者 4已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @lo9data5
- 此快照首次捕获于
- 2023/10/28 09:32 2 年前
- 此快照最后确认于
- 2023/10/28 09:32 2 年前
已知全正权有向图最长路可以转化为全负权有向图最短路(可以拓扑dp解决,这里只是想试试dij可不可以)
在这道题一直wa,求助这样做为什么不可以?
CPP#include <unordered_map>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <cstring>
#include <sstream>
#include <numeric>
#include <cstdio>
#include <string>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;
typedef double db;
typedef long long ll;
typedef long double ldb;
typedef unsigned int ui;
typedef vector<int> vi;
typedef pair<int, int> pii;
typedef unsigned long long ull;
#define rep(i, a, n) for(int i = (a); i <= (n); ++i)
#define per(i, a, n) for(int i = (a); i >= (n); --i)
#define IOS ios::sync_with_stdio(0); cin.tie(0);
#define mst(a, b) memset((a), (b), sizeof(a));
#define all(x) (x).begin(),(x).end()
#define tem template<class T> inline
#define sz(v) ((int)(v).size())
#define lowbit(x) (x & -x)
#define linf 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define space putchar(' ')
#define enter puts("")
#define endl '\n'
#define pb push_back
#define fi first
#define se second
#define rd read()
#define ls (u << 1)
#define rs (u << 1 | 1)
const double eps = 1e-8;
const double pi = acos(-1.0);
ll sq(ll t) {return t * t;}
tem bool chmax(T &a, T b) {if(a < b) {a = b; return 1;} return 0;}
tem bool chmin(T &a, T b) {if(a > b) {a = b; return 1;} return 0;}
tem int sgn(T x) {return x > eps ? 1 : (x < -eps ? -1 : 0);}
ostream &operator << (ostream &os, const pii &p)
{return os << "(" << p.fi << ", " << p.se << ")";}
const int mod = 1e9 + 7;
const int N = 1e5 + 5;
int n, m, dis[N];
vector<pii> e[N];
bool vis[N];
struct event {
int u, d;
friend bool operator < (event a, event b) {return a.d > b.d;}
};
void dij(int s) {
priority_queue<event> q;
q.push({s, 0});
mst(vis, 0);
rep(i, 2, n) dis[i] = inf;
while(!q.empty()) {
int u = q.top().u; q.pop();
if(vis[u]) continue;
vis[u] = true;
for(auto [v, w] : e[u]) {
if(dis[u] + w < dis[v]) {
dis[v] = dis[u] + w;
q.push({v, dis[v]});
}
}
}
}
int main() {
cin >> n >> m;
rep(i, 1, m) {
int u, v, w; cin >> u >> v >> w;
e[u].pb({v, -w});
}
dij(1);
cout << (dis[n] == inf ? -1 : -dis[n]) << endl;
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...