zoukankan      html  css  js  c++  java
  • uva10917 dij单源最短路预处理+构造新图(DAG)+求图上路径数

      1 //uva10917 dij单源最短路预处理+构造新图(DAG)+求图上路径数
      2 #include<iostream>
      3 #include<string.h>
      4 #include<stdio.h>
      5 #include<stdlib.h>
      6 #include<cmath>
      7 #include<algorithm>
      8 #include<queue>
      9 #include<stack>
     10 #include<set>
     11 #include<map>
     12 #define maxn 1100
     13 #define INF 100000000
     14 using namespace std;
     15 
     16 vector<int>G[maxn];
     17 int d[maxn];//DAG上dfs记忆化,存储i到终点的路径数
     18 struct Edge
     19 {
     20     int u,v,dis;
     21 };
     22 struct Node
     23 {
     24     int d,u;
     25     bool operator<(const Node &x)const{
     26         return d>x.d;
     27     }
     28 };
     29 struct Dijkstra
     30 {
     31     int n,m;
     32     vector<Edge>edge;
     33     vector<int>G[maxn];
     34     bool vis[maxn];
     35     int d[maxn],p[maxn];
     36 
     37     void init(int n)
     38     {
     39         this->n=n;
     40         edge.clear();
     41         for(int i=0;i<=n;i++) G[i].clear();
     42     }
     43 
     44     void add(int u,int v,int c){
     45         edge.push_back((Edge){u,v,c});
     46         m=edge.size();
     47         G[u].push_back(m-1);
     48     }
     49 
     50     void dij(int s)
     51     {
     52         memset(vis,0,sizeof(vis));
     53         for(int i=0;i<=n;i++) d[i]=INF;
     54         d[s]=0;
     55         priority_queue<Node>Q;
     56         Q.push((Node){0,s});
     57         while(!Q.empty()){
     58             Node x=Q.top();Q.pop();
     59             int u=x.u;
     60             if (vis[u]) continue;
     61             vis[u]=true;
     62             for(int i=0;i<G[u].size();i++)
     63             {
     64                 Edge &e=edge[G[u][i]];
     65                 if (d[e.v]>d[u]+e.dis){
     66                     d[e.v]=d[u]+e.dis;
     67                     p[e.v]=G[u][i];
     68                     Q.push((Node){d[e.v],e.v});
     69                 }
     70             }
     71         }
     72     }
     73 }Dij1;
     74 
     75 int nextint(){int x;scanf("%d",&x);return x;}
     76 
     77 int n,m,ans;
     78 
     79 int dfs(int st)//DAG上dp,记忆化搜索
     80 {
     81     int ans=0;
     82     if (d[st]!=-1) return d[st];
     83     for(int i=0;i<G[st].size();i++) ans+=dfs(G[st][i]);
     84     return d[st]=ans;
     85 }
     86 void read(int n,int m)
     87 {
     88     for(int i=0;i<m;i++)
     89     {
     90         int u,v,c;
     91         u=nextint();v=nextint();c=nextint();
     92         Dij1.add(u,v,c);
     93         Dij1.add(v,u,c);
     94     }
     95     Dij1.dij(2);
     96 }
     97 void solve(int n,int m)
     98 {
     99     for(int i=1;i<=n;i++) G[i].clear();
    100     //建图,注意是枚举每条边,不可能构造出新的边~
    101     for(int i=0;i<Dij1.m;i++)
    102     {
    103         Edge e=Dij1.edge[i];
    104         int u=e.u,v=e.v;
    105         if (Dij1.d[u]<Dij1.d[v]) G[v].push_back(u);
    106     }
    107     for(int i=1;i<=n;i++) d[i]=-1;
    108     d[2]=1;
    109     dfs(1);
    110     printf("%d
    ",d[1]);
    111 }
    112 int main()
    113 {
    114     int n,m;
    115     while(cin>>n)
    116     {
    117         if (n==0) break;
    118         cin>>m;
    119         Dij1.init(n);
    120         read(n,m);
    121         solve(n,m);
    122     }
    123     return 0;
    124 }
  • 相关阅读:
    一次性删除 .svn 文件夹
    vim
    03 练习题:字符串
    04 练习题:元组、列表
    05 练习题:字典
    Python基础学习笔记(07)基础类型操作及转化、编码
    Python基础学习笔记(06)代码块、集合、深浅copy
    Python基础学习笔记(05)字典
    Python基础学习笔记(04)列表、元组
    67.滚轮事件
  • 原文地址:https://www.cnblogs.com/little-w/p/3587867.html
Copyright © 2011-2022 走看看