参考自:https://blog.csdn.net/qq_21899803/article/details/63685476
#include<cstdio>
#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=509;
int head[maxn];
int top;
struct Edge{
int v,w,next,h;
}edge[maxn*maxn];
void add(int u,int v,int w,int h){
edge[top].v=v;
edge[top].w=w;
edge[top].h=h;
edge[top].next=head[u];
head[u]=top++;
}
void init(){
top=0;
memset(head,-1,sizeof(head));
}
priority_queue<pair<int,int> >q;
bool vis[maxn];
struct Node{
int dis;
int fa;
}a[maxn],b[maxn];//时间,长度;
int dis[maxn];//求时间最短时需要考虑的相同时间路径最短;
int st,en;
int n;
const int inf=0x3f3f3f3f;
vector<int>v1;//时间;
vector<int>v2;
int vvv[maxn];//记录当前节点到st的最短路径的节点个数;
void dij1(){//时间
memset(vis,0,sizeof(vis));
//memset(a,0x3f,sizeof(a));
for(int i=0;i<n;++i){
a[i].dis=inf;
a[i].fa=i;
}
for(int i=head[st];i!=-1;i=edge[i].next){
int v=edge[i].v;
dis[v]=edge[i].w;
}
dis[st]=0;
a[st].dis=0;
while(!q.empty()) q.pop();
q.push(make_pair(0,st));
while(!q.empty()){
int u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u