Security Badges

Security Badges

 

 

 

 题解:先把每个区间的端点存下来,然后排序,然后对每一个端点跑dfs,看其能否从起点到达终点,如果这个点能到达,就说明一定有一个区间包括了这个端点,我们就用这个端点减去他的前一个端点,得到的这个区间一定是符合条件的区间,之后将这些区间大小相加即可。

AC_Code:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 #define endl '\n'
 5 const int maxn=1e3+10;
 6 const int maxm=5e3+10;
 7 const int inf=0x3f3f3f3f;
 8  
 9 struct node{
10     int to,nxt,l,r;
11 }e[maxm];
12  
13 int head[maxn],tot;
14 int n,m,k,s,t,ans;
15 int p[maxm*2],cnt,vis[maxn];
16  
17 void addedge(int u,int v,int l,int r){
18     e[tot].to=v; e[tot].nxt=head[u]; e[tot].l=l; e[tot].r=r; head[u]=tot++;
19 }
20  
21 void dfs(int u,int cur){
22     vis[u]=1;
23     for(int i=head[u];~i;i=e[i].nxt){
24         int to=e[i].to,l=e[i].l,r=e[i].r;
25         if( !vis[to] && l<=cur && cur<=r )
26             dfs(to,cur);
27     }
28 }
29  
30 void init(){
31     memset(head,-1,sizeof(head));
32     tot=0;
33 }
34  
35 int main()
36 {
37     init();
38     scanf("%d%d%d",&n,&m,&k);
39     scanf("%d%d",&s,&t);
40     for(int i=0;i<m;i++){
41         int u,v,l,r;
42         scanf("%d%d%d%d",&u,&v,&l,&r);
43         addedge(u,v,l,r);
44         p[++cnt]=l-1;//注意这里设的好:1.保证这个点可以的话,他和它前面的点一定在一个区间,且该区间的数都可以;2.保证了区间长度计算正确
45         p[++cnt]=r;
46     }
47     sort(p+1,p+1+cnt);
48     int reu=unique(p+1,p+1+cnt)-p-1;
49     for(int i=1;i<=reu;i++){
50         memset(vis,0,sizeof(vis));
51         dfs(s,p[i]);
52         if( vis[t] ) ans+=p[i]-p[i-1];
53     }
54     printf("%d\n",ans);
55     return 0;
56 }

 

posted @ 2020-08-04 23:34  swsyya  阅读(194)  评论(0编辑  收藏  举报

回到顶部