zoukankan      html  css  js  c++  java
  • pat1121-1131

    1121

    #include<cmath>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<set>
    #include<vector>
    #include<queue>
    #include<stack>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N = 1e6+5;
    const int INF = 0x3f3f3f3f;
    #define MP(x, y) make_pair(x, y)
    
    int pai[N];
    int a[N];
    int has[N];
    int ord[N];
    int main() {
      int n;
      while(~scanf("%d", &n)) {
        memset(pai, -1, sizeof(pai));
        for(int i = 0; i < n; ++i) {
          int a, b; scanf("%d%d", &a, &b);
          pai[a] = b; pai[b] = a;
        }
    
        int m; scanf("%d", &m);
        for(int i = 0; i < m; ++i) {
          scanf("%d", &a[i]);
          has[a[i]] ++; if(pai[a[i]] != -1) has[pai[a[i]]] ++;
        }
        int tot = 0;
        for(int i = 0; i < m; ++i) {
          if(has[a[i]] == 1) {
            ord[tot ++] = a[i];
          }
        }
    
        sort(ord, ord + tot);
        printf("%d
    ", tot);
        for(int i = 0; i < tot; ++i) {
          if(i) printf(" ");
          printf("%05d", ord[i]);
        }
        if(tot) printf("
    ");
      }
      return 0;
    }

    1122 我把爆搜都写完了,才发现这题的圈顺序是给定的,我爆搜就不删了

    #include<cmath>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<set>
    #include<vector>
    #include<queue>
    #include<stack>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N = 205;
    const int INF = 0x3f3f3f3f;
    #define MP(x, y) make_pair(x, y)
    
    struct Node{
      int to, nx;
    }E[N*N*2];
    int mp[N][N];
    int head[N], tot;
    void add(int fr, int to) {
      E[tot].to = to; E[tot].nx = head[fr]; head[fr] = tot ++;
    }
    set<int> st;
    int suc;
    void dfs(int l, int r) {
      printf("%d %d
    ", l, r);
      if(suc) return;
      if(st.size() == 0) {
        if(mp[l][r]) suc = 1;
        return;
      } 
      if(st.size() == 1) {
        int tt = *st.begin();
        if(mp[l][tt] && mp[r][tt]) {
          suc = 1;
        } 
        return;
      }
    
    
      vector<int> ch1; vector<int> ch2;
      for(int i = head[l]; ~i; i = E[i].nx) {
        if(st.find(E[i].to) != st.end()) {
          ch1.push_back(E[i].to);
        }
      }
      if(l == r) {
        for(int i = 0; i < ch1.size() && !suc; ++i) {
          for(int j = i+1; j < ch1.size() && !suc; ++j) {
            st.erase(ch1[i]); st.erase(ch1[j]);
            dfs(ch1[i], ch1[j]);
            st.insert(ch1[i]); st.insert(ch1[j]);
          }
        }
        return;
      }
      for(int i = head[r]; ~i; i = E[i].nx) {
        if(st.find(E[i].to) != st.end()) {
          ch2.push_back(E[i].to);
        }
      }
    
      for(int i = 0; i < ch1.size() && !suc; ++i) {
        for(int j = 0; j < ch2.size() && !suc; ++j) {
          if(ch1[i] != ch2[j]) {
            st.erase(ch1[i]); st.erase(ch2[j]);
            dfs(ch1[i], ch2[j]);
            st.insert(ch1[i]); st.insert(ch2[j]);
          }
        }
      }
    
    }
    int main() {
      int n,m;
      while(~scanf("%d %d", &n, &m)) {
        memset(head, -1, sizeof(head));
        tot = 0;
    
        for(int i = 0; i < m; ++i) {
          int a, b; scanf("%d %d", &a, &b);
          add(a, b); add(b, a);
          mp[a][b] = mp[b][a] = 1;
        }
    
    
        int k; scanf("%d", &k);
        while(k --) {
          int a; scanf("%d", &a);
          int fl = 1;
          st.clear();
          int pre = -1;
          int St = -1;
    
          for(int i = 0; i < a; ++i) {
            int b; scanf("%d", &b);
            if(St == -1) St = b;
            if(st.find(b) != st.end() && i != a-1) fl = 0;
            if(i == a-1 && St != b) fl = 0;
            if(~pre && !mp[b][pre]) fl = 0;
            pre = b;
            st.insert(b);
          }
    
        //  int tt = *st.begin(); st.erase(tt);
        //  suc = 0;
        //  dfs(tt, tt);
    
          if(fl && a > 4) printf("YES
    ");
          else printf("NO
    ");
        }
      }
      return 0;
    }

    1123 和之前一道avl类似

    #include<cmath>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<set>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N = 25;
    const int INF = 0x3f3f3f3f;
    #define MP(x, y) make_pair(x, y)
    
    int root;
    int num[N];
    int L[N], R[N], fa[N];
    int n;
    
    void insert(int x, int tag) {
      //  printf("tag: %d
    ", x);
      if(!root) {
        root = tag; fa[tag] = tag; return; 
      }
      if(num[x] > num[tag]) {
        if(!L[x])  L[x] = tag, fa[tag] = x;
        else insert(L[x], tag);
      }else {
        if(!R[x])  R[x] = tag, fa[tag] = x;
        else insert(R[x], tag);
      }
    }
    
    
    struct Node{
      int po, val;
      Node(int a=0, int b=0):po(a), val(b){}
    }E[10];
    int cmp(Node a,Node b) {
      return a.val < b.val;
    }
    
    void LL(int x) {
      //  printf("LL
    ");
      int fart = fa[fa[x]];
      int t1 = x; int t2 = R[x]; int t3 = fa[x];
      fa[t1] = 0; fa[t2] = 0; fa[t3] = 0;
      R[t1] = t3; fa[t3] = t1;
      L[t3] = t2; fa[t2] = t3;
    
      if(t3 == root) {
        root = t1; fa[t1] = t1;
      }else if(L[fart] == t3) {
        L[fart] = t1; fa[t1] = fart;
      }else R[fart] = t1, fa[t1] = fart;
    }
    void RR(int x) {
      //  printf("RR
    ");
      int fart = fa[fa[x]];
      int t1 = x; int t2 = L[x]; int t3 = fa[x];
      fa[t1] = 0; fa[t2] = 0; fa[t3] = 0;
      L[t1] = t3; fa[t3] = t1;
      R[t3] = t2; fa[t2] = t3;
    
      if(t3 == root) {
        root = t1; fa[t1] = t1;
      }else if(L[fart] == t3) {
        L[fart] = t1; fa[t1] = fart;
      }else R[fart] = t1, fa[t1] = fart;
    }
    void LR(int x, int tag) {
      //  printf("LR
    ");
    
      int fart = fa[fa[x]];
      int t1 = x; int t2 = R[x]; int t3 = fa[x];
      int a1 = L[t2]; int a2 = R[t2];
    
      fa[t1] = 0; fa[t2] = 0; fa[t3] = 0;
      R[t1] = 0; L[t3] = 0;
      L[t2] = t1; fa[t1] = t2;
      R[t2] = t3; fa[t3] = t2;
      if(t3 == root) {
        root = t2; fa[t2] = t2;
      }else if(L[fart] == t3) {
        L[fart] = t2; fa[t2] = fart;
      }else {
        R[fart] = t2; fa[t2] = fart;
      }
    
      if(a1) insert(root, a1);
      if(a2) insert(root, a2);
    }
    void RL(int x, int tag) {
      //  printf("RL
    ");
      int fart = fa[fa[x]];
      int t1 = x; int t2 = L[x]; int t3 = fa[x];
      int a1 = L[t2]; int a2 = R[t2];
    
      L[t1] = 0; R[t3] = 0;
      fa[t1] = 0; fa[t2] = 0; fa[t3] = 0;
      L[t2] = t3; fa[t3] = t2;
      R[t2] = t1; fa[t1] = t2;
      //   printf("hh %d %d %d
    ", num[t1], num[t2], num[t3]);
      if(t3 == root) {
        root = t2; fa[t2] = t2;
      }else if(L[fart] == t3) {
        L[fart] = t2; fa[t2] = fart;
      }else {
        R[fart] = t2; fa[t2] = fart;
      }
      //  printf("hh %d %d", fart, R[fart]);
      if(a1) insert(root, a1);
      if(a2) insert(root, a2);
    }
    void fix(int x) {
      int rt = fa[fa[x]]; int fart = fa[rt];
      if( (L[rt]==0) + (R[rt]==0) == 1) {
        int tot = 0;
        for(int i = 0, tt = x; i < 3; ++i) {
          E[tot++] = Node(tt, num[tt]); 
          tt = fa[tt];
        }  
        sort(E, E+tot, cmp);
        L[E[1].po] = E[0].po; fa[E[0].po] = E[1].po;  
        R[E[1].po] = E[2].po; fa[E[2].po] = E[1].po;
        L[E[0].po] = 0; R[E[0].po] = 0;
        L[E[2].po] = 0; R[E[2].po] = 0;
    
        if(root == rt) {
          root = E[1].po; fa[root] = root;
        }else if(L[fart] == rt) {
          L[fart] = E[1].po; fa[E[1].po] = fart;
        }else {
          R[fart] = E[1].po; fa[E[1].po] = fart;
        }
      }else {
        //  printf("%d %d %d
    ", x, rt, fa[rt]);
        if     (L[fa[rt]] == rt && L[rt] == fa[x] ) LL(rt);
        else if(R[fa[rt]] == rt && R[rt] == fa[x] ) RR(rt);
        else if(L[fa[rt]] == rt && R[rt] == fa[x] ) LR(rt, x);
        else if(R[fa[rt]] == rt && L[rt] == fa[x] ) RL(rt, x);
      }
    }
    void test(int x, int pre) {
      printf("%d from %d
    ", x, pre);
      if(L[x]) test(L[x], x);
      if(R[x]) test(R[x], x);
    }
    
    int height[N]; int tag;
    void dfs(int x) {
      int t1 = 0, t2 = 0;
      if(L[x]) dfs(L[x]), t1 = height[L[x]];
      if(R[x]) dfs(R[x]), t2 = height[R[x]];
      height[x] = max(t1, t2)+1;
      if( abs(t1- t2) > 1  && !tag) tag = x;
    }
    void solve(int x) {
      //  printf("do %d
    ", x);
      memset(height, 0, sizeof(height));
      tag = 0;
      dfs(root);
      if(tag) {
        int t1 = tag;
        if(height[L[t1]] > height[R[t1]]) t1 = L[t1];
        else t1 = R[t1];
    
        if(height[L[t1]] > height[R[t1]]) t1 = L[t1];
        else t1 = R[t1];
    
        if(height[L[t1]] > height[R[t1]]) t1 = L[t1];
        else if(height[L[t1]] < height[R[t1]]) t1 = R[t1];
    
        //  printf("%d %d
    ", tag, t1);
        fix(t1);
      }
      //  test(root, root);
      //  printf("
    ");
    }
    void bfs(int x) {
      int all = 0;
      queue<int> Q;
      Q.push(x);
      while(Q.front() != 0) {
        int po = Q.front(); Q.pop();
        all ++;
        Q.push(L[po]); Q.push(R[po]);
      }
      while(!Q.empty()) Q.pop();
      Q.push(x);
      int nn = 0;
      while(!Q.empty()) {
        int po = Q.front(); Q.pop();
        if(!nn) nn = 1; else printf(" ");
        printf("%d", num[po]);
        if(L[po]) Q.push(L[po]);
        if(R[po]) Q.push(R[po]);
      }
      printf("
    ");
      if(all == n) printf("YES
    ");
      else printf("NO
    ");
    
    }
    int main() {
      while(~scanf("%d", &n)) {
        root = 0;
        memset(fa, 0, sizeof(fa));
        memset(L, 0, sizeof(L));
        memset(R, 0, sizeof(R));
    
        for(int i = 1; i <= n; ++i) {
          scanf("%d", &num[i]);
          insert(root, i);
          solve(i);
          //  fa[root] = root;
          //  check(root);
        }
      //  printf("hh
    ");
        bfs(root);
      //  printf("%d
    ", num[root]);
      }
      return 0;
    }

    1124

    #include<cmath>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<set>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N = 25;
    const int INF = 0x3f3f3f3f;
    #define MP(x, y) make_pair(x, y)
    
    map<string, int> mp;
    int main() {
      int m, n, s;
      while(~scanf("%d %d %d", &m, &n, &s)) {
        int won = s;
        int all = 0;
        mp.clear();
        for(int i = 1, j = 1; i <= m; ++i) {
          char s[10]; scanf("%s", s);
          if(j == won) {
            if(mp.find(s) == mp.end()) printf("%s
    ", s), won += n, all ++;
            else j --;
            mp[s] = 1;
          }
          j++;
        }
        if(!all) printf("Keep going...
    ");
      }
      return 0;
    }

    1125 讲道理我没有读懂题之前 = =我以为在你们选几个组成不就行了,直接选两个最大的

    #include<cmath>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<set>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N = 1e4+5;
    const int INF = 0x3f3f3f3f;
    #define MP(x, y) make_pair(x, y)
    
    int a[N];
    int main() {
      int n;
      while(~scanf("%d", &n)) {
        for(int i = 0; i < n; ++i) scanf("%d", &a[i]);
        sort(a, a + n);
        int ans = a[0];
        for(int i = 1; i < n; ++i) {
          ans = (ans + a[i]) / 2;
        }
        printf("%d
    ", ans);
      }
      return 0;
    }

    1126需先判断下图的连通性

    #include<cmath>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<set>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N = 505;
    const int INF = 0x3f3f3f3f;
    #define MP(x, y) make_pair(x, y)
    
    struct Node{
      int to, nx;
    }E[N*N*2];
    int head[N], tot;
    int vis[N];
    void add(int fr, int to) {
      E[tot].to = to; E[tot].nx = head[fr]; head[fr] = tot ++;
    }
    void dfs(int x) {
      for(int i = head[x]; ~i; i = E[i].nx) {
        int to = E[i].to;
        if(!vis[to]) {
          vis[to] = 1;
          dfs(to);
        }
      }
    }
    int in[N];
    int main() {
      int n, m;
      while(~scanf("%d %d", &n, &m)) {
        memset(in, 0, sizeof(in));
        memset(vis, 0, sizeof(vis));
        memset(head, -1, sizeof(head)); tot = 0;
    
        for(int i = 0; i < m; ++i) {
          int a, b; scanf("%d %d", &a, &b);
          add(a, b); add(b, a); 
          in[a] ++; in[b] ++;
        }
        vis[1] = 1; 
        dfs(1);
    
        int fl = 1;
        for(int i = 1; i <= n; ++i) {
          if(!vis[i]) {
            fl = 0; break;
          }
        }
    
        int odd = 0; int even = 0;
        for(int i = 1; i <= n; ++i) {
          if(in[i] % 2 == 0) even ++;
          else odd ++;
        }
    
        for(int i = 1; i <= n; ++i) {
          if(i != 1) printf(" ");
          printf("%d", in[i]);
        } printf("
    ");
    
        if(odd == 0 && fl) printf("Eulerian
    ");
        else if(odd == 2 && fl) printf("Semi-Eulerian
    ");
        else printf("Non-Eulerian
    ");
    
    
      }
      return 0;
    }

    1127

    #include<cmath>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<set>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N = 35;
    const int INF = 0x3f3f3f3f;
    #define MP(x, y) make_pair(x, y)
    
    int in[N];
    int post[N];
    map<int, int> L;
    map<int, int> R;
    
    int solve(int LL, int RR, int l, int r) {
      if(l > r) return 0;
         else if(l == r) return post[l];
    
      int tag = post[r];
      int po = 0;
      for(int i = LL; i <= RR; ++i) {
        if(in[i] == tag) {
          po = i; break;
        }
      }
      int _po = l + (po-1-LL);
    
      L[tag] = solve(LL, po-1, l, _po);
         R[tag] = solve(po+1, RR, _po+1, r-1);
    
      return tag;
    }
    void bfs(int x) {
      queue<int> Q;
      Q.push(x);
      int fl = 1;
    
      while(!Q.empty()) {
        vector<int> vc;
        int ed = Q.size();
        for(int i = 0; i < ed; ++i) {
          int po = Q.front(); Q.pop();
          vc.push_back(po);
          if(L[po]) Q.push(L[po]);
          if(R[po]) Q.push(R[po]);
        }
    
        if(fl) for(int i = vc.size()-1; i >= 0; --i) {
          if(vc[i] != x) printf(" ");
          printf("%d", vc[i]);
        }else for(int i = 0; i < vc.size(); ++i) {
          if(vc[i] != x) printf(" ");
          printf("%d", vc[i]);
        }
        fl ^= 1;
      }
      printf("
    ");
    }
    int main() {
      int n;
      while(~scanf("%d", &n)) {
    
        for(int i = 1; i <= n; ++i) {
          scanf("%d", &in[i]);
        }
    
    
        for(int i = 1; i <= n; ++i) scanf("%d", &post[i]);
    
        int root = solve(1, n, 1, n);
    
        bfs(root);  
      }
      return 0;
    }

    1128

    #include<cmath>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<set>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N = 1005;
    const int INF = 0x3f3f3f3f;
    #define MP(x, y) make_pair(x, y)
    
    int dia1[N*2];
    int row[N];
    int dia2[N*2];
    
    int main() {
      int k;
      while(~scanf("%d", &k)) {
    
        for(int i = 1; i <= k; ++i) {
          int a; scanf("%d", &a);
          int fl = 1;
    
          for(int j = 1; j <= a; ++j) {
            int b; scanf("%d", &b);
            int t1 = b; int t2 = b-j + a; int t3 = b+j;
            if(row[t1] == i|| dia1[t2] == i || dia2[t3] == i ) fl = 0;
    
            row[t1] = i; dia1[t2] = i; dia2[t3] = i;
          }  
    
          if(fl) printf("YES
    ");
          else printf("NO
    ");
        }
    
      }
      return 0;
    }

    1129

    #include<cmath>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<set>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N = 5e4+5;
    const int INF = 0x3f3f3f3f;
    #define MP(x, y) make_pair(x, y)
    
    int has[N];
    int a[N];
    struct Node{
      int nu, po;
      Node(int a=0, int b=0):nu(a), po(b) {}
      bool operator <(const Node &T) const  {
        if(nu != T.nu) return nu > T.nu;
        else return po < T.po;
      }
    };
    set<Node> st;
    set<Node> ::iterator it;
    
    int main() {
      int n, k;
      while(~scanf("%d %d", &n, &k)) {
        st.clear();
        memset(has, 0, sizeof(has));
    
        for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    
        has[a[1]] ++;
        st.insert(Node(has[a[1]], a[1]));
    
        for(int i = 2; i <= n; ++i) {
          printf("%d: ", a[i]);
          int cnt = 0;
          for(it = st.begin(); it != st.end(); ++it) {
            if(it != st.begin()) printf(" ");
            printf("%d", (*it).po);
            cnt ++;
            if(cnt >= k) break;
          }
          printf("
    ");
    
    
          has[a[i]] ++;
    
          it = st.find(Node(has[a[i]]-1, a[i]) );
          if( it != st.end() ) st.erase(it), st.insert(Node(has[a[i]], a[i]));
          else {
            st.insert(Node(has[a[i]], a[i]));
            if(st.size() > k) st.erase(--st.end());
          }
    
        }  
      }
      return 0;
    }

    1030

    #include<cmath>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<set>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N = 25;
    const int INF = 0x3f3f3f3f;
    #define MP(x, y) make_pair(x, y)
    
    char num[N][15];
    int dep[N];
    int root;
    int L[N], R[N];
    
    void dfs(int x) {
      if(x != root && L[x] + R[x]) printf("(");
      if(L[x]) dfs(L[x]);
      printf("%s", num[x]);
      if(R[x]) dfs(R[x]);
      if(x != root && L[x] + R[x]) printf(")");
    }
    int main() {
      int n;
      while(~scanf("%d", &n)) {
        for(int i = 1; i <= n; ++i) {
          char b[10], c[10];
          scanf("%s %s %s", num[i], b, c);
          int tt;
          if(b[0] != '-') {
            sscanf(b, "%d", &tt);
            L[i] = tt, dep[tt] ++;
          }
          if(c[0] != '-') {
            sscanf(c, "%d", &tt);
            R[i] = tt; dep[tt] ++;
          }
        }
        for(int i = 1; i <= n; ++i) {
          if(!dep[i]) {
            root = i;
            dfs(i);
            break;
          }
        }
    
        printf("
    ");
    
    
      }
      return 0;
    }

    1031 最后一题还是花了一点时间,简单来说就是最短路即可,但是中间处理还是有点难的

    #include<cmath>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<set>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N = 105;
    const int M = 1e5+5;
    
    const int INF = 0x3f3f3f3f;
    #define MP(x, y) make_pair(x, y)
    
    map<int, int> nam;
    map<int, int> ::iterator it;
    int _nam[M];
    vector<int> input[N];
    int n; 
    int tol;
    struct Node{
      int nx, to, ty;
    }E[M*10];
    int head[M], tot;
    void add(int fr, int to, int ty) {
      E[tot].to = to; E[tot].nx = head[fr]; E[tot].ty = ty; head[fr] = tot++;
    }
    struct Hode{
      int po, di, ti, ty;
      Hode(int a=0, int b=0, int c=0, int d=0):po(a), di(b), ti(c), ty(d) {}
      bool operator < (const Hode & T) const{
        if(di != T.di) return di > T.di;
        else return ti > T.ti;
      }
    };
    pair<int, int> pre[M]; int vis[M];
    int dis[M], tim[M];
    vector<pair<int, int> > ans;
    
    void dfs(int x, int s) {
    //  printf("%d %d
    ", x, _nam[x]);
      if(x == s) {
        return ;
      }
      dfs(pre[x].first, s);
      ans.push_back(MP(x, pre[x].second));
    }
    
    void dij(int s, int t) {
    //  printf("%d %d
    ", s, t);
      for(int i = 1; i <= tol; ++i) {
        vis[i] = 0; dis[i] = INF; tim[i] = INF;
      }
      dis[s] = 0; tim[s] = 0;
      priority_queue<Hode> Q;
      Q.push(Hode(s, dis[s], tim[s], INF));
      while(!Q.empty()) {
        int po = Q.top().po; int ty = Q.top().ty; Q.pop();
        if(vis[po]) continue;
        vis[po] = 1;
        for(int i = head[po]; ~i; i = E[i].nx) {
          int to = E[i].to;
             int tt = ty != E[i].ty;  
          if(dis[to] > dis[po] + 1) {
            dis[to] = dis[po] + 1;
            tim[to] = tim[po] + tt;
            pre[to] = MP(po, E[i].ty);
            Q.push(Hode(to, dis[to], tim[to], E[i].ty));
          }else if(dis[to] == dis[po] + 1 && tim[to] > tim[po] + tt )  {
            tim[to] = tim[po] + tt;
            pre[to] = MP(po, E[i].ty);
            Q.push(Hode(to, dis[to], tim[to], E[i].ty));
          }
        }
      }
      ans.clear();
      dfs(t, s);
      printf("%d
    ", dis[t]);
      int fr = s;
      ans.push_back(MP(INF, INF));
      for(int i = 1; i < ans.size(); ++i) {
        if(ans[i].second != ans[i-1].second) {
          printf("Take Line#%d from %04d to %04d.
    ", ans[i-1].second, _nam[fr], _nam[ans[i-1].first]);
          fr = ans[i-1].first;
        }
      }
    }
    
    int main() {
      while(~scanf("%d", &n)) {
        memset(head, -1, sizeof(head)); tot = 0;
    
        for(int i = 1; i <= n; ++i) {
          int m; scanf("%d", &m);
          input[i].push_back(m);
          for(int j = 0; j < m; ++j) {
            int b; scanf("%d", &b);
            input[i].push_back(b);
            nam[b] ++;
          }
        }
    
        tol = 0;
        for(it = nam.begin(); it != nam.end(); ++it) {
          nam[it->first] = ++tol;
          _nam[tol] = it->first;
        }
        // for(int i = 1; i <= tol; ++i) printf("%d:%d ", _nam[i], nam[_nam[i]]); printf("
    ");
    
        for(int i = 1; i <= n; ++i) {
          for(int j = 2; j < input[i].size(); ++j) {
            add(nam[input[i][j]], nam[input[i][j-1]], i); add(nam[input[i][j-1]], nam[input[i][j]], i);
          }
        }
    
        int m; scanf("%d", &m);
        while(m --) {
          int a, b; scanf("%d %d", &a, &b);
          dij(nam[a], nam[b]);
        }  
      }
      return 0;
    }
  • 相关阅读:
    部分页面开启宽屏模式
    门户diy实现翻页功能的方法
    git命令详解,从入门到装逼
    array方法常用记载
    vue 生命周期的理解(created && mouted的区别)
    微信小程序传值的几种方式
    data-*
    本地存储和会话存储以及cookie的处理
    vue的安装和项目构建
    进击的UI----------动画
  • 原文地址:https://www.cnblogs.com/Basasuya/p/8433700.html
Copyright © 2011-2022 走看看