对我这种蒟蒻来说,调了好久好久;
代码巨丑陋。。。
#include
using namespace std;
typedef pair< int,int > pii;
const int inf=2e9;
const int N=700010;
struct zmk{
int u,v,l,a;
}a[N*3];
struct hyq{
int next,to,va;
}e[N*2];
int head[N],cnt,fa[N],vis[N],lg[N],cas,f[N][21],h[N][21],tot;
int val[N],st[N],b[N],en[N],d[N],root;
int n,m,q,k;
int find(int u){
if(fa[u]==u) return fa[u];
return fa[u]=find(fa[u]);
}
void addedge(int u,int v,int d){
e[++cnt].next=head[u];
e[cnt].to=v;
e[cnt].va=d;
head[u]=cnt;
}
bool cmp(zmk a,zmk b){
return a.a>b.a;
}
void dijkstra(){
d[1]=0;
priority_queue< pii,vector,greater > q;
q.push(make_pair(d[1],1));
while(!q.empty()){
int u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(d[v]>d[u]+e[i].va){
d[v]=d[u]+e[i].va;
q.push(make_pair(d[v],v));
}
}
}
}
void kruskal(){
for(int i=1;i<=m;i++){
val[i+n]=a[i].a;
int sa=find(a[i].u),sb=find(a[i].v);
if(sa!=sb){
addedge(i+n,sa,0);
addedge(i+n,sb,0);
fa[sa]=i+n;
fa[sb]=i+n;
}
}
}
void dfs(int u){
st[u]=++tot;
b[tot]=u;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
f[v][0]=u;
dfs(v);
}
en[u]=tot;
}
void init(){
f[root][0]=0;
for(int j=1;j<=20;j++)
for(int i=1;i<=n+m;i++){
f[i][j]=f[f[i][j-1]][j-1];
}
for(int i=1;i<=tot;i++){
if(b[i]<=n) h[i][0]=d[b[i]];
else h[i][0]=inf;
}
for(int j=1;j<=20;j++)
for(int i=1;i<=tot-(1<> 1] + 1;
scanf("%d",&cas);
while(cas--){
tot=cnt=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) head[i]=0;
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&a[i].u,&a[i].v,&a[i].l,&a[i].a);
addedge(a[i].u,a[i].v,a[i].l);
addedge(a[i].v,a[i].u,a[i].l);
}
for(int i=1;i<=n;i++){
d[i]=inf;
vis[i]=0;
}
dijkstra();
cnt=0;
for(int i=1;i<=n+m;i++) head[i]=0;
sort(a+1,a+m+1,cmp);
for(int i=1;i<=n+m;i++) fa[i]=i;
for(int i=1;i<=n;i++) val[i]=inf;
kruskal();
root=find(1);
dfs(root);
//for(int i=1;i<=tot;i++) cout<=0;i--){
if(val[f[v][i]]>p){
v=f[v][i];
}
}
printf("%d\n",ans=query(st[v],en[v]));
}
}
}
代码很长还没什么用