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 }