码迷,mamicode.com
首页 > 其他好文 > 详细

[日常训练]school

时间:2016-11-10 03:03:12      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:font   add   set   com   ems   ack   rip   stack   code   

Description

众所周知,技术分享家离学校很远。于是,技术分享每天算准了时间出发,以保证能在上课铃响前 技术分享秒到达学校。
不幸的是,技术分享市最近正在修路。这就导致有些路可能无法通行,因而可能导致技术分享迟到。
技术分享不打算改变他的出发时间,现在他告诉你他通过每一条路的时间,他想要知道如果某条路被维修了,那么他是否能避免迟到?

Input

第一行输入两个正整数技术分享,分别表示点数(路口)和边数(路)。
第二行输入两个正整数技术分享,表示家标号为技术分享,学校标号为技术分享
接下来技术分享行,每行三个整数技术分享,表示有一条连接技术分享的道路,技术分享走过该路所需的时间为技术分享
接下来一个整数技术分享,表示询问的个数。
最后技术分享行,每行一个正整数技术分享,表示询问若第技术分享条边正在维修,技术分享是否能按时到校。

Output

输出技术分享行。
对于每一个询问,若技术分享能准时到校输出一行一个字符串技术分享,否则输出技术分享.

(字符串严格匹配,不含双引号)

Sample Input

8 11

1 8

1 2 3

1 3 1

2 3 1

2 4 5

2 5 1

4 5 4

3 5 2

5 6 4

6 7 5

6 8 2

7 8 5

5

2

3

8

4

10

Sample Output

No
Yes
No
Yes
No

HINT

技术分享,保证源点到任意点的最短路长度不超过技术分享

Solution

先求出技术分享技术分享最短路的副图.如果一条边是副图的割边,那么无法避免迟到.

#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 40005
#define M 400005
using namespace std;
typedef long long ll;
struct graph{
    int nxt,to,n;ll w;
}e[M],e1[M];
ll dis[N];
int g[N],g1[N],dfn[N],low[N],n,m,s,t,cnt;
bool b[M],f[N],inq[N];
queue<int> q;
inline int read(){
    int ret=0;char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)){
        ret=(ret<<1)+(ret<<3)+c-0;
        c=getchar();
    }
    return ret;
}
inline void adde(int i,int x,int y){
    e1[++cnt].nxt=g1[x];g1[x]=cnt;
    e1[cnt].to=y;e1[cnt].n=i;
}
inline void addedge(int i,int x,int y,int z){
    e[++cnt].nxt=g[x];g[x]=cnt;
    e[cnt].to=y;e[cnt].w=(ll)(z);e[cnt].n=i;
}
inline void spfa(int u){
    for(int i=1;i<=n;++i)
        dis[i]=(ll)(1e+7);
    q.push(u);dis[u]=0;inq[u]=true;
    while(!q.empty()){
        u=q.front();q.pop();inq[u]=false;
        for(int i=g[u];i;i=e[i].nxt)
            if(dis[e[i].to]<0||dis[u]+e[i].w<dis[e[i].to]){
                dis[e[i].to]=dis[u]+e[i].w;
                if(!inq[e[i].to]){
                    q.push(e[i].to);inq[e[i].to]=true;
                }
            }
    }
}
inline void bfs(int u){
    memset(inq,0,sizeof(inq));
    cnt=0;q.push(u);inq[u]=true;
    while(!q.empty()){
        u=q.front();q.pop();
        for(int i=g[u];i;i=e[i].nxt)
            if(dis[e[i].to]+e[i].w==dis[u]){
                adde(e[i].n,e[i].to,u);adde(e[i].n,u,e[i].to);
                if(!inq[e[i].to]){
                    q.push(e[i].to);inq[e[i].to]=true;
                }
            }
    }
}
inline void tarjan(int u,int f){
    dfn[u]=low[u]=++cnt;
    for(int i=g1[u];i;i=e1[i].nxt)
        if(!dfn[e1[i].to]){
            tarjan(e1[i].to,u);
            low[u]=min(low[u],low[e1[i].to]);
            if(low[e1[i].to]>dfn[u]) b[e1[i].n]=true; 
        }
        else if(e1[i].to!=f)
            low[u]=min(low[u],dfn[e1[i].to]);
}
inline void init(){
    n=read();m=read();
    s=read();t=read();
    for(int i=1,x,y,z;i<=m;++i){
        x=read();y=read();z=read();
        addedge(i,x,y,z);addedge(i,y,x,z);
    }
    spfa(s);bfs(t);tarjan(s,0);
    int q=read();
    while(q--){
        if(b[read()]) puts("No");
        else puts("Yes");
    }
}
int main(){
    freopen("school.in","r",stdin);
    freopen("school.out","w",stdout);
    init();
    fclose(stdin);
    fclose(stdout);
    return 0;
}

[日常训练]school

标签:font   add   set   com   ems   ack   rip   stack   code   

原文地址:http://www.cnblogs.com/AireenYe/p/6049296.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!