• Heavy Transportation POJ


    #include <set>
    #include <map>
    #include <deque>
    #include <queue>
    #include <stack>
    #include <cmath>
    #include <ctime>
    #include <bitset>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cstdlib>
    #include <cstring>
    #include <cassert>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    /*迪杰斯特拉算法为啥不能有负边
       因为你要保证从队列中取出来的最小的点x一定是该节点到原点的最短距离
       如果有负边,那么可能比他大的y点再加上负边导致x结点距离变得更小
       这道题利用了迪杰斯特拉的思想
    */
    const int  INF=0x3f3f3f3f;
    const int maxn=1000+10;
    int dis[maxn],vis[maxn];
    struct Node
    {
        int v,value;
        Node()
        {
    
        }
        Node(int a,int b)
        {
            v=a;
            value=b;
        }
        bool operator<(const Node &d)const
        {
            return value<d.value;
        }
    };
    vector<Node>G[maxn];
    void dji()
    {
        priority_queue<Node> que;
        que.push(Node(1,INF));
        while(!que.empty())
        {
            Node node=que.top();
            que.pop();
            if(vis[node.v])
                continue;
            vis[node.v]=1;
            int v=node.v;
            dis[v]=node.value;
            for(int i=0; i<G[v].size(); i++)
            {
                Node node1=G[v][i];
                int v1=node1.v;
                if(vis[v1])continue;
                dis[v1]=max(dis[v1],min(dis[v],G[v][i].value));
                que.push(Node(v1,dis[v1]));
            }
        }
    
    }
    int n,m;
    int main()
    {
        int t;
        scanf("%d",&t);
        int kase=0;
        while(t--)
        {
            scanf("%d%d",&n,&m);
            int a,b,c;
            memset(dis,0,sizeof dis);
            memset(vis,0,sizeof vis);
            for(int i=1;i<=n;i++)G[i].clear();//别忘了清除
            for(int i=0; i<m; i++)
            {
                scanf("%d%d%d",&a,&b,&c);
                G[a].push_back(Node(b,c));
                G[b].push_back(Node(a,c));
            }
            dji();
            if(n!=1)
                printf("Scenario #%d:
    %d
    
    ",++kase,dis[n]);
           else
            printf("Scenario #%d:
    0
    
    ",++kase);
        }
        return 0;
    }

    #include <set>#include <map>#include <deque>#include <queue>#include <stack>#include <cmath>#include <ctime>#include <bitset>#include <cstdio>#include <string>#include <vector>#include <cstdlib>#include <cstring>#include <cassert>#include <iostream>#include <algorithm>
    using namespace std;/*迪杰斯特拉算法为啥不能有负边   因为你要保证从队列中取出来的最小的点x一定是该节点到原点的最短距离   如果有负边,那么可能比他大的y点再加上负边导致x结点距离变得更小   这道题利用了迪杰斯特拉的思想*/const int  INF=0x3f3f3f3f;const int maxn=1000+10;int dis[maxn],vis[maxn];struct Node{    int v,value;    Node()    {
        }    Node(int a,int b)    {        v=a;        value=b;    }    bool operator<(const Node &d)const    {        return value<d.value;    }};vector<Node>G[maxn];void dji(){    priority_queue<Node> que;    que.push(Node(1,INF));    while(!que.empty())    {        Node node=que.top();        que.pop();        if(vis[node.v])            continue;        vis[node.v]=1;        int v=node.v;        dis[v]=node.value;        for(int i=0; i<G[v].size(); i++)        {            Node node1=G[v][i];            int v1=node1.v;            if(vis[v1])continue;            dis[v1]=max(dis[v1],min(dis[v],G[v][i].value));            que.push(Node(v1,dis[v1]));        }    }
    }int n,m;int main(){    int t;    scanf("%d",&t);    int kase=0;    while(t--)    {        scanf("%d%d",&n,&m);        int a,b,c;        memset(dis,0,sizeof dis);        memset(vis,0,sizeof vis);        for(int i=1;i<=n;i++)G[i].clear();        for(int i=0; i<m; i++)        {            scanf("%d%d%d",&a,&b,&c);            G[a].push_back(Node(b,c));            G[b].push_back(Node(a,c));        }        dji();        if(n!=1)            printf("Scenario #%d: %d ",++kase,dis[n]);       else        printf("Scenario #%d: 0 ",++kase);    }    return 0;}

  • 相关阅读:
    vue 文件分段上传
    深度clone
    js 导出excel
    js 校验
    设计模式原则
    多态
    数据库sql
    Redis快速入门
    C#中使用Redis学习二 在.NET4.5中使用redis hash操作
    在c#中使用servicestackredis操作redis
  • 原文地址:https://www.cnblogs.com/zhangzhenjun/p/12297227.html
Copyright © 2020-2023  润新知