zoukankan      html  css  js  c++  java
  • loj 1271

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26981

    思路:题目的意思是求给定的起点到终点的最短路径序列,并且这个序列的字典顺序最小。我们可以先求最短路,然后对那些在最短路上的点进行深度优先搜索。

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<vector>
      6 #include<queue>
      7 #include<set>
      8 using namespace std;
      9 
     10 const int MAXN=55555;
     11 const int inf=1<<30;
     12 vector<int>g[MAXN],vet,ans;
     13 int n,st,ed;
     14 
     15 int dist[MAXN];
     16 bool mark[MAXN];
     17 
     18 struct Node{
     19     int v,d;
     20     Node(int vv,int dd){
     21         v=vv,d=dd;
     22     }
     23     bool operator < (const Node &p) const {
     24         if(p.d!=d)return p.d<d;
     25         return p.v<v;
     26     }
     27 };
     28 
     29 
     30 void Dijkstra()
     31 {
     32     memset(mark,false,sizeof(mark));
     33     fill(dist,dist+MAXN,inf);
     34     priority_queue<Node>que;
     35     que.push(Node(st,0));
     36     dist[st]=0;
     37     while(!que.empty()){
     38         Node p=que.top();
     39         que.pop();
     40         if(mark[p.v])continue;
     41         mark[p.v]=true;
     42         for(int i=0;i<(int)g[p.v].size();i++){
     43             int v=g[p.v][i];
     44             if(mark[v])continue;
     45             if(dist[p.v]+1<dist[v]){
     46                 dist[v]=dist[p.v]+1;
     47                 que.push(Node(v,dist[v]));
     48             }    
     49         }
     50     }
     51 }
     52 
     53 bool dfs(int u)
     54 {
     55     set<int>st;
     56     if(u==ed)return true;
     57     for(int i=0;i<g[u].size();i++){
     58         int v=g[u][i];
     59         if(dist[u]+1==dist[v])st.insert(v);
     60     }
     61     set<int>::iterator iter;
     62     for(iter=st.begin();iter!=st.end();iter++){
     63         ans.push_back(*iter);
     64         if(dfs(*iter))return true;
     65         ans.pop_back();
     66     }
     67     return false;
     68 }
     69         
     70 
     71 
     72 int main()
     73 {
     74     int _case,t=1;
     75     scanf("%d",&_case);
     76     while(_case--){
     77         scanf("%d",&n);
     78         vet.clear();
     79         ans.clear();
     80         for(int i=1;i<MAXN;i++)g[i].clear();
     81         for(int i=1;i<=n;i++){
     82             int x;
     83             scanf("%d",&x);
     84             vet.push_back(x);
     85         }
     86         st=vet[0],ed=vet[(int)vet.size()-1];
     87         for(int i=0;i<(int)vet.size()-1;i++){
     88             int u=vet[i],v=vet[i+1];
     89             g[u].push_back(v);
     90             g[v].push_back(u);
     91         }
     92         Dijkstra();
     93         printf("Case %d:
    ",t++);
     94         ans.push_back(st);
     95         dfs(st);
     96         for(int i=0;i<(int)ans.size()-1;i++){
     97             printf("%d ",ans[i]);
     98         }
     99         printf("%d
    ",ed);
    100     }
    101     return 0;
    102 }
    103 
    104         
    View Code
  • 相关阅读:
    Python学习之collections module-defaultdict()
    LinkList Operation
    Eng1—English daily notes
    (知识扩展)R运用领域一览表
    TED_Topic3:The hidden reason for poverty the world needs to address now
    Stat3—因子分析(Factor Analysis)
    R3—日期处理
    Stat2—主成分分析(Principal components analysis)
    TED_Topic2:My desperate journey with a human smuggler
    MagicB.0—怎样设置电脑自动关机?
  • 原文地址:https://www.cnblogs.com/wally/p/3397447.html
Copyright © 2011-2022 走看看