zoukankan      html  css  js  c++  java
  • UVA10342 Always Late(次短路)

    题意:一个简单图,求这个图两点之间的次短路!

    分析:因为只要求次短路,所以只要保存两点之间的最短和次短这两个状态即可,用dijkstra可求出....

    同时要注意,若a->a,这则点的最短路为0!还有要注意的是最短路和次短路的距离不能相等!

    // File Name: 10342.cpp
    // Author: Zlbing
    // Created Time: 2013/5/18 11:02:05
    
    #include<iostream>
    #include<string>
    #include<algorithm>
    #include<cstdlib>
    #include<cstdio>
    #include<set>
    #include<map>
    #include<vector>
    #include<cstring>
    #include<stack>
    #include<cmath>
    #include<queue>
    using namespace std;
    #define CL(x,v); memset(x,v,sizeof(x));
    #define INF 0x3f3f3f3f
    #define LL long long
    #define REP(i,r,n) for(int i=r;i<=n;i++)
    #define RREP(i,n,r) for(int i=n;i>=r;i--)
    const int MAXN=105;
    int d[MAXN][MAXN][2];
    int G[MAXN][MAXN];
        int n,m;
    struct node{
        int u,cost;
        bool operator <(const node& a)const{
            return cost>a.cost;
        }
    };
    void dij(int s)
    {
        priority_queue<node>Q;
        for(int i=0;i<n;i++)
            if(G[s][i])
                Q.push((node){i,G[s][i]});
        node t,tt;
        while(!Q.empty())
        {
            t=Q.top();
            Q.pop();
            int u=t.u;
            int cost=t.cost;
            if(d[s][u][0]==0)
            {
                d[s][u][0]=cost;
            }
            else{
                if(d[s][u][0]>cost)
                {
                    d[s][u][1]=d[s][u][0];
                    d[s][u][0]=cost;
                }
                else if(d[s][u][0]==cost)continue;
                else if(d[s][u][1]==0||d[s][u][1]>cost)
                {
                    d[s][u][1]=cost;
                }
                else continue;
            }
            for(int i=0;i<n;i++)
            {
                if(G[u][i])
                    Q.push((node){i,G[u][i]+cost});
            }
        }
    }
    
    int main()
    {
        int T=0;
        //freopen("out.txt","w",stdout);
        while(~scanf("%d%d",&n,&m))
        {
            int a,b,c;
            CL(G,0);
            REP(i,1,m)
            {
                scanf("%d%d%d",&a,&b,&c);
                G[a][b]=c;
                G[b][a]=c;
            }
            printf("Set #%d\n",++T);
            CL(d,0);
            REP(i,0,n-1)
                dij(i);
            int cas;
            scanf("%d",&cas);
            REP(i,1,cas)
            {
                scanf("%d%d",&a,&b);
                if(a!=b){
                if(d[a][b][1])
                    printf("%d\n",d[a][b][1]);
                else printf("?\n");
                }
                else {
                    if(d[a][b][0])
                        printf("%d\n",d[a][b][0]);
                    else printf("?\n");
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    金蝶数据库执行语句
    金蝶 更新价格分录表触发器
    金蝶触发器,生成条码信息
    SQL从中文中获取拼音首字母
    C语言 typedef用法
    这姑娘漂亮不,说实话,有糖吃
    条码开发的意义在哪里
    ERP开发,重点不在功能
    金蝶出入库数据库表里加字段后出现的问题解决
    解决金蝶未检测到K/3许可文件,并且该账套已超过演示版期限问题
  • 原文地址:https://www.cnblogs.com/arbitrary/p/3085218.html
Copyright © 2011-2022 走看看