• UVa 1599 Ideal Path【BFS】


    题意:给出n个点,m条边,每条边上涂有一个颜色,求从节点1到节点n的最短路径,如果最短路径有多条,要求经过的边上的颜色的字典序最小

    紫书的思路:第一次从终点bfs,求出各个节点到终点的最短距离,

    第二次bfs从起点沿着每到达一个节点d[]减少1来走,按照颜色的字典序最小的路径来走

      1 #include<iostream>  
      2 #include<cstdio>  
      3 #include<cstring> 
      4 #include <cmath> 
      5 #include<stack>
      6 #include<vector>
      7 #include<map> 
      8 #include<set>
      9 #include<queue> 
     10 #include<algorithm>  
     11 using namespace std;
     12 
     13 typedef long long LL;
     14 const int INF = 1000000000;
     15 const int mod=1000000007;
     16 const int maxn=100005;
     17 
     18 struct Edge{
     19     int u,v,c;
     20     Edge(int u=0,int v=0,int c=0):u(u),v(v),c(c){}
     21 };
     22 
     23 vector<Edge> edges;
     24 vector<int> G[maxn];
     25 
     26 void addedges(int u,int v,int c){
     27     edges.push_back(Edge(u,v,c));
     28     int idx=edges.size()-1;
     29     G[u].push_back(idx);
     30 }
     31 
     32 int n,vis[maxn],d[maxn];
     33 
     34 void rev_bfs(){//求出每一个节点到终点n-1的距离 
     35     memset(vis,0,sizeof(vis));
     36     vis[n-1]=true;
     37     d[n-1]=0;
     38     
     39     queue<int> q;
     40     q.push(n-1);
     41     while(!q.empty()){
     42         int v=q.front();q.pop();
     43         for(int i=0;i<G[v].size();i++){
     44             int e=G[v][i];
     45             int u=edges[e].v;
     46             if(!vis[u]){
     47                 vis[u]=true;
     48                 d[u]=d[v]+1;
     49                 q.push(u);
     50             }
     51         }
     52     }
     53 }
     54 
     55 vector<int> ans;
     56 
     57 void bfs(){
     58     memset(vis,0,sizeof(vis));
     59     vis[0]=true;
     60     ans.clear();
     61     
     62     vector<int> next;
     63     next.push_back(0);
     64     
     65     for(int i=0;i<d[0];i++){
     66         int min_color=INF;
     67         for(int j=0;j<next.size();j++){
     68             int u=next[j];
     69             for(int k=0;k<G[u].size();k++){
     70                 int e=G[u][k];
     71                 int v=edges[e].v;
     72                 if(d[u]==d[v]+1)
     73                 min_color=min(min_color,edges[e].c); 
     74             }
     75         }
     76         
     77         ans.push_back(min_color);
     78                 
     79         vector<int> next2;
     80         for(int j=0;j<next.size();j++){
     81             int u=next[j];
     82             for(int k=0;k<G[u].size();k++){
     83                 int e=G[u][k];
     84                 int v=edges[e].v;
     85                 if(d[u]==d[v]+1&&edges[e].c==min_color&&!vis[v]) {
     86                     vis[v]=true;
     87                     next2.push_back(v);
     88                 }
     89             }
     90         }
     91         next=next2;        
     92     }
     93     
     94     printf("%d
    ",ans.size());
     95     printf("%d",ans[0]);
     96     for(int i=1;i<ans.size();i++) printf(" %d",ans[i]);
     97     printf("
    ");
     98 } 
     99 
    100 int main(){
    101     int m,u,v,c;
    102     while(scanf("%d %d",&n,&m)==2){
    103         edges.clear();
    104         for(int i=0;i<n;i++) G[i].clear();
    105         
    106         while(m--){
    107             scanf("%d %d %d",&u,&v,&c);
    108             addedges(u-1,v-1,c);
    109             addedges(v-1,u-1,c);
    110         }
    111         rev_bfs();
    112         bfs();
    113     }
    114     return 0;
    115 }
    View Code

    这道题放了一个月,最后还是看的标程,艾---看来有些题目不是拖得越久就会了,,,,

    不要懒的说啊----

    加油--gooooooooooooo---

  • 相关阅读:
    插入排序
    选择排序
    P1338 末日的传说 逆序数对
    P1582倒水 位运算
    P2158 [SDOI2008] (欧拉函数
    HDU 6274 二分+预处理(CCPC K题
    P1219 N皇后
    [USACO1.5] 回文质数
    Codeforces #123D: 后缀数组+单调栈
    单调栈 单调队列
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4464019.html
Copyright © 2020-2023  润新知