dijkstra的ac代码:
#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define f(i,a,n) for(int i=a;i<n;++i)
#define ff(i,a,n) for(int i=a;i<=n;++i)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> PII;
//ll下的最大值,注意末尾加上ll
const ll INF=0x3f3f3f3f3f3f3f3fll;
//因为建两次边,M要开2倍的大小
const int N=1e5+5,M=4e5+5;
int h1[N],h2[N],ne[M],w[M],e[M],idx;
int n,m,Q,st[N];
ll d1[N],d2[N],radio[N];
//数组本质上传的是地址,直接修改h1和h2数组的信息
void add(int h[],int a,int b,int c){
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void dij(int h[],ll d[],int start){
//ll也可以这样memset初始化
memset(d,0x3f,sizeof d1);
memset(st,0,sizeof st);
priority_queue<PII,vector<PII>,greater<PII>> q;
d[start]=0;
q.push({0,start});
while(q.size()){
auto t=q.top();q.pop();
int k=t.second;
for(int i=h[k];~i;i=ne[i]){
int j=e[i];
if(d[j]>d[k]+w[i]){
d[j]=d[k]+w[i];
q.push({d[j],j});
}
}
}
}
int main(){
memset(h1,-1,sizeof h1);
memset(h2,-1,sizeof h2);
cin>>n>>m>>Q;
f(i,0,m){
int a,b,c,d;
cin>>a>>b>>c>>d;
add(h1,a,b,c);
add(h2,b,a,d);
}
dij(h1,d1,1);
dij(h2,d2,n);
ff(i,1,n){
cin>>radio[i];
}
//注意multiset元素类型不是int,是ll
multiset<ll> st1;
ff(i,1,n){
//可能出现不连通的情况,此时会有非法结果进入,而且还不是无穷大,所以得避免这种情况的出现
if(d1[i]!=INF && d2[i]!=INF){
st1.insert(d1[i]+(d2[i]+radio[i]-1)/radio[i]);
}
}
f(i,0,Q){
int a,b;
cin>>a>>b;
//只更新合法结果到multiset里面
if(d1[a]!=INF && d2[a]!=INF){
// 错误示范:
// st1.erase(d1[a]+(d2[a]+radio[a]-1)/radio[a]);
//下面这种是只删除一个数据
st1.erase(st1.find(d1[a]+(d2[a]+radio[a]-1)/radio[a]));
radio[a]=b;
st1.insert(d1[a]+(d2[a]+radio[a]-1)/radio[a]);
}
cout<<(*st1.begin())<<endl;
}
return 0;
}
spfa的28分代码(测试点6会超时):
#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define f(i,a,n) for(int i=a;i<n;++i)
#define ff(i,a,n) for(int i=a;i<=n;++i)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> PII;
//
const ll INF=0x3f3f3f3f3f3f3f3fll;
const int N=1e5+5,M=4e5+5;
int h1[N],h2[N],ne[M],w[M],e[M],idx;
int n,m,Q,st[N];
ll d1[N],d2[N],radio[N];
void add(int h[],int a,int b,int c){
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void spfa(int h[],ll d[],int start){
memset(d,0x3f,sizeof d1);
memset(st,0,sizeof st);
d[start]=0;st[start]=1;
queue<int> q;
q.push(start);st[start]=1;
while(q.size()){
int t=q.front();q.pop();st[t]=0;
for(int i=h[t];~i;i=ne[i]){
int j=e[i];
if(d[j]>d[t]+w[i]){
d[j]=d[t]+w[i];
if(!st[j]){
q.push(j);
st[j]=1;
}
}
}
}
}
int main(){
memset(h1,-1,sizeof h1);
memset(h2,-1,sizeof h2);
cin>>n>>m>>Q;
f(i,0,m){
int a,b,c,d;
cin>>a>>b>>c>>d;
add(h1,a,b,c);
add(h2,b,a,d);
}
spfa(h1,d1,1);
spfa(h2,d2,n);
ff(i,1,n){
cin>>radio[i];
}
multiset<ll> st1;
ff(i,1,n){
if(d1[i]!=INF && d2[i]!=INF){
st1.insert(d1[i]+(d2[i]+radio[i]-1)/radio[i]);
}
}
f(i,0,Q){
int a,b;
cin>>a>>b;
if(d1[a]!=INF && d2[a]!=INF){
st1.erase(st1.find(d1[a]+(d2[a]+radio[a]-1)/radio[a]));
radio[a]=b;
st1.insert(d1[a]+(d2[a]+radio[a]-1)/radio[a]);
}
cout<<(*st1.begin())<<endl;
}
return 0;
}