#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+10;
const int M = 1e6;
const int INF = 0x3f3f3f3f;
typedef pair<ll,ll>PII;
int n, m;
int e[M], ne[M], h[M], w[M], v[M], idx;
void add(int a, int b, int w1, int v1) {
e[idx] = b, w[idx] = w1, v[idx] = v1, ne[idx] = h[a], h[a] = idx++;
}
int p[N], st[N];
ll dt[N], val[N];
ll dij1(int u){
ll Dt[N];
int St[N];
memset(Dt,0x3f,sizeof Dt);
memset(St,0,sizeof St);
Dt[u] = 0;
int flag = u;
priority_queue<PII, vector<PII>, greater<PII>> q;
q.push({ 0,u });
while (!q.empty()) {
auto t = q.top();
q.pop();
int distance = t.first, ver = t.second;
if (St[ver]) continue;
St[ver] = 1,flag = ver;
for (int i = h[ver]; i != -1; i = ne[i]) {
int j = e[i];
int wi = w[i];
if (!St[j] && distance + wi < Dt[j]) {
Dt[j] = distance + wi;
q.push({distance + wi, j});
}
}
}
return Dt[flag];
}
void dijkstra(int u) {
dt[u] = 0, val[u] = 0;
priority_queue<PII, vector<PII>, greater<PII>> q;
q.push({ 0,u });
while (!q.empty()) {
auto t = q.top();
q.pop();
int distance = t.first, ver = t.second;
if (st[ver]) continue;
st[ver] = 1;
for (int i = h[ver]; i != -1; i = ne[i]) {
int j = e[i];
int wi = w[i];
if (!st[j] && distance + wi < dt[j]) {
p[j] = ver;
dt[j] = distance + wi;
q.push({ distance + wi,j });
val[j] = val[ver] + v[i];
}else if(!st[j] && distance + wi==dt[j]){
if(val[j]<val[ver] +v[i]){
p[j] = ver;
val[j] = val[ver] +v[i];
}
}
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
memset(h, -1, sizeof h);
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a, b, w1, v1;
cin >> a >> b >> w1 >> v1;
add(a, b, w1, v1);
add(b, a, w1, v1);
}
int k;
cin >> k;
int a[N];
for (int i = 1; i <= k; i++) cin >> a[i];
PII minmax = {INF,0};
for(int i = 1;i<=n;i++){
ll d = dij1(i);
if(d<minmax.first||(d==minmax.first&&i<minmax.second)) minmax = {d,i};
}
memset(dt, 0x3f, sizeof dt);
memset(p, -1, sizeof p);
cout<<minmax.second<<endl;
dijkstra(minmax.second);
for (int i = 1; i <= k; i++) {
int t = a[i];
vector<int> b;
for (int j = t; j != -1; j = p[j]) b.push_back(j);
for (int j = b.size() - 1; j >= 0; j--) {
cout << b[j];
if (j != 0) cout << "->";
}
cout<<endl;
cout << dt[t] << ' ' << val[t] << endl;
}
return 0;
}
过不了
大数据确实过不了(但是如果是pta应该能过90%的点),这题很恶心,你把floyd给删掉,对每一个可能的点做一次dijkstra应该是能过,因为floyd是n^3的,dijkstra是nlogn的
懂了