比赛 EYOI与SBOI开学欢乐赛5th 评测结果 AWWAW
题目名称 SERNET模拟 最终得分 40
用户昵称 该账号已注销 运行时间 0.110 s
代码语言 C++ 内存使用 48.15 MiB
提交时间 2022-09-16 21:23:13
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
struct eg{
    int t,n,w;
}e[410];
int n,m,k,hd[410]={0},cnt=0,T,ans=0;
int tim[110][100100]={0};
int id[1010],stm[1010],fr[1010],to[1010];
int fwq[110];
int lstm[100100]={0};
void add(int x,int y,int z){
    e[++cnt].t=y;
    e[cnt].n=hd[x];
    hd[x]=cnt;
    e[cnt].w=z;
}
void spfa(int id,int stm,int fr,int t){
    queue<int>q;
    int dis[110];
    q.push(fr);
    memset(dis,0x3f,sizeof(dis));
    dis[fr]=stm;
    bool v[110]={0};
    v[fr]=1;
    while(!q.empty()){
        int x=q.front();
        q.pop();
        v[x]=0;
        for(int i=hd[x];i;i=e[i].n){
            int ver=e[i].t;
            int w=e[i].w;
            if(dis[ver]>dis[x]+w){
                dis[ver]=dis[x]+w;
                if(v[ver]==0&&ver!=t){
                    v[ver]=1;
                    q.push(ver);
                }
            }
        }
    }
    for(int i=1;i<=n;i++){
        tim[fwq[i]][id]=min(tim[fwq[i]][id],dis[fwq[i]]);
    }
}
void spfa2(int fr,int t,int id,int stm){
    queue<int>q;
    q.push(fr);
    int dis[110]={0};
    dis[fr]=stm;
    bool v[110]={0};
    v[fr]=1;
    while(!q.empty()){
        int x=q.front();
        q.pop();v[x]=0;
        for(int i=hd[x];i;i=e[i].n){
            int ver=e[i].t;
            int w=e[i].w;
            if(dis[ver]<dis[x]+w){
                dis[ver]=dis[x]+w;
                if(v[ver]==0&&ver!=t&&dis[ver]<=tim[ver][id]){
                    q.push(ver);
                    v[ver]=1;
                }
            }
        }
    }
    for(int i=1;i<=n;i++){
        int id2=fwq[i];
        lstm[id]=max(lstm[id],dis[id2]);
    }
}
int main(){
    freopen("sernet.in","r",stdin);
    freopen("sernet.out","w",stdout);
    cin>>n;
    memset(tim,0x3f,sizeof(tim));
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        fwq[i]=x;
    }
    cin>>m;
    for(int i=1;i<=m;i++){
        int x,y,z;
        cin>>x>>y>>z;
        add(x,y,z);
        add(y,x,z);
    }
    cin>>k;
    for(int i=1;i<=k;i++){
        cin>>id[i]>>stm[i]>>fr[i]>>to[i];
        spfa(id[i],stm[i],fr[i],to[i]);
    }
    for(int i=1;i<=k;i++){
        spfa2(fr[i],to[i],id[i],stm[i]);
    }
    cin>>T;
    for(int i=1;i<=k;i++){
        if(lstm[id[i]]>T)ans++;
    }
    cout<<ans<<endl;
    return 0;
}