zoukankan      html  css  js  c++  java
  • uva 10917

    求出各点与终点的距离 ,然后在求得的DAG 上做动规

    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    using namespace std;

    struct my{
       int v;
       int next;
       int dist;
    };

    struct headnode{
      int dist;
      int u;
      bool operator <(const headnode& v)const{
         return dist>v.dist;
      }
    };

    typedef long long ll;
    #define nil 0x7fffffff
    const int maxn=100000+5;
    int n,m;
    int dp[maxn];
    int adj[maxn+10];
    bool vis[maxn+10];
    int p[maxn+10];
    int d[maxn+10];
    my bian[maxn*2+10];
    int fa;

    void init(){
       memset(adj,-1,sizeof(adj));
       memset(bian,-1,sizeof(bian));
       memset(p,0,sizeof(p));
       memset(vis,false,sizeof(vis));
       memset(dp,0,sizeof(dp));
       fa=0;
    }

    void myinsert(int u,int v,int dist){
      bian[++fa].v=v;
      bian[fa].next=adj[u];
      bian[fa].dist=dist;
      adj[u]=fa;
    }

    void dijkstra(int x){
         priority_queue<headnode>q;
         headnode c;
         for (int i=0;i<=n;i++) d[i]=nil;
         d[x]=0;
         c.u=x;
         c.dist=0;
         q.push(c);
         while(!q.empty()){
            c=q.top();
            q.pop();
            int u=c.u;
            if(vis[u]) continue;
            vis[u]=true;
            for (int i=adj[u];i!=-1;i=bian[i].next){
                my v=bian[i];
                if(d[u]+v.dist<d[v.v]){
                    d[v.v]=d[u]+v.dist;
                    p[v.v]=u;
                    if(vis[v.v]) continue;
                    c.u=v.v;
                    c.dist=v.dist;
                    q.push(c);
                }
            }
            vis[u]=false;
         }
    }
    int DFS(int pos) {
        if (pos == 2) return 1;
        if (dp[pos] > 0) {
            return dp[pos];
        }
        int ans = 0;
        for (int i=adj[pos];i!=-1;i=bian[i].next) {
            if (d[pos] > d[bian[i].v]) {
                ans+=DFS(bian[i].v);
            }
        }
        return dp[pos]=ans;
    }

    int main(){
        int u,v,zhi;
         while(scanf("%d",&n)&&n!=0){
            scanf("%d",&m);
            init();
            for (int i=1;i<=m;i++){
                scanf("%d%d%d",&u,&v,&zhi);
                myinsert(u,v,zhi);
                myinsert(v,u,zhi);
            }
            dijkstra(2);
           printf("%d ",DFS(1));
         }
    return 0;
    }

  • 相关阅读:
    一致性网络设备命名——linux 网络接口 命名 p1p1 em1
    施一公
    硬盘安装Fedora20出错
    电影里的黑客为何都不用鼠标
    Windows8下硬盘安装Fedora17——可能会遇到的问题
    linux mutt详解
    Red Hat Enterprise Linux 7.0 Beta —— document
    UNIX、Linux、Solaris、Windows到底谁更好?
    Windows与UNIX/Linux之比较
    Windows打败了Unix,但Linux是打不倒的!
  • 原文地址:https://www.cnblogs.com/lmjer/p/8321704.html
Copyright © 2011-2022 走看看