NOIp2014 寻找道路

这道题本身真的不怎么难,但是

"路径上所有的点的出边所指向的点都直接或间接与终点连通"

这句话真的是太ex了。。

我隐隐约约记得当年做这道题时的懵逼,看来当时的代码确实是没什么问题,只是因为理解上的误差

教训:好好看题,看明白了再做,要不然一切都是白干。

题干

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<queue>
  5 #include<algorithm>
  6 
  7 using namespace std;
  8 
  9 typedef long long ll;
 10 
 11 const int Maxn = 1e4+10,Maxm = 2e5+10;
 12 
 13 ll read(){
 14     ll ans = 0;
 15     char last = ' ',ch = getchar();
 16     while(ch < '0'||ch > '9')last = ch,ch = getchar();
 17     while('0' <= ch&&ch <= '9')ans = ans*10+ch-'0',ch = getchar();
 18     if(last == '-')return -ans;return ans;
 19 }
 20 
 21 struct Edge{
 22     int to,ne;
 23 }edges[2][Maxm],e;
 24 
 25 struct Node{
 26     int to,d;
 27     bool operator <(const Node& x)const{
 28         return d > x.d;
 29     }
 30 };
 31 
 32 int first[2][Maxn];
 33 int d[Maxn],vis[Maxn],v2[Maxn];
 34 int cnte = 0,n,m,u,v,s,t;
 35 
 36 void add_edge(int fr,int to){
 37     edges[1][++cnte] = (Edge){to,first[1][fr]};
 38     edges[0][cnte] = (Edge){fr,first[0][to]};
 39     first[1][fr] = first[0][to] = cnte;
 40 }
 41 
 42 void dfs(int s){
 43     vis[s] = 1;
 44     for(int i = first[0][s];i;i = edges[0][i].ne){
 45         e = edges[0][i];
 46         if(vis[e.to])continue;
 47         dfs(e.to);
 48     }
 49 }
 50 
 51 void del(int s){
 52     vis[s] = 0;
 53     for(int i = first[0][s];i;i = edges[0][i].ne){
 54         e = edges[0][i];
 55         if(vis[e.to])del(e.to);
 56     }
 57 }
 58 
 59 void dijkstra(int s){
 60     priority_queue<Node> q;
 61     q.push((Node){s,0});
 62     memset(d,0x3f,sizeof(d));
 63     d[s] = 0;
 64     while(!q.empty()){
 65         u = q.top().to;
 66         q.pop();
 67         if(vis[u])continue;
 68         vis[u] = 1;
 69         for(int i = first[1][u];i;i = edges[1][i].ne){
 70             e = edges[1][i];
 71             if(d[e.to] > d[u]+1){
 72                 d[e.to] = d[u]+1;
 73                 q.push((Node){e.to,d[e.to]});
 74             }
 75         }
 76     }
 77 }
 78 
 79 int main(){
 80     n = read(),m = read();
 81     for(int i = 1;i <= m;i++){
 82         u = read(),v = read();
 83         if(u != v)add_edge(u,v);
 84     }
 85     s = read(),t = read();
 86     dfs(t);
 87     for(int i = 1;i <= n;i++)if(!vis[i]){
 88         v2[i] = 1;
 89         for(int j = first[0][i];j;j = edges[0][j].ne){
 90             e = edges[0][j];
 91             v2[e.to] = 1;
 92         }
 93     }
 94     for(int i = 1;i <= n;i++)vis[i] = v2[i];
 95     vis[s] = 0; 
 96     dijkstra(s);
 97     if(d[t] == d[0])cout << -1 << '\n';
 98     else cout << d[t] << '\n';
 99 return 0;
100 }

 

posted @ 2019-09-15 23:58  TIH_HIT  阅读(161)  评论(0编辑  收藏  举报