zoukankan      html  css  js  c++  java
  • POJ 1797 Heavy Transportation

    和POJ 2253 恰好相反。这个是求1-n的路中最小的边。也可以用 迪杰斯特拉 弗洛伊德 和spfa 三种方法写。注意一下 初始化将dist初始化为极大值,其他没什么了。贴个spfa的

    #include<stdio.h>
    #include<string.h>
    #include<cstring>
    #include<string>
    #include<math.h>
    #include<queue>
    #include<algorithm>
    #include<iostream>
    #include<stdlib.h>
    #include<cmath>
    
    #define INF 0x3f3f3f3f
    #define MAX 1000005
    
    using namespace std;
    
    struct node
    {
    int u,v,next,w;
    }Map[MAX];
    
    int n,m,vis[MAX],k,a[MAX],dist[MAX];
    
    void Init()
    {
    memset(vis,0,sizeof(vis));
    
    for(int i=0;i<MAX;i++)
    {
    a[i]=-1;
    dist[i]=0;
    }
    }
    
    void Add(int u,int v,int w)
    {
    Map[k].u=u;
    Map[k].v=v;
    Map[k].w=w;
    Map[k].next=a[u];
    
    a[u]=k++;
    }
    
    void spfa()
    {
    queue<int>Q;
    int start=1,i;
    dist[1]=INF;
    vis[1]=1;
    Q.push(start);
    
    while(!Q.empty())
    {
    start=Q.front();
    Q.pop();
    vis[start]=0;
    
    for(i=a[start];i!=-1;i=Map[i].next)
    {
    int v=Map[i].v;
    
    if(dist[v] < dist[start] && dist[v] < Map[i].w)
    {
    dist[v]=min(dist[start],Map[i].w);
    
    if(!vis[v])
    {
    vis[v]=1;
    Q.push(v);
    }
    }
    }
    }
    }
    
    int main()
    {
    int i,cas=1,x,y,w,T;
    
    scanf("%d",&T);
    
    while(T--)
    {
    Init();
    
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
    scanf("%d%d%d",&x,&y,&w);
    Add(x,y,w);
    Add(y,x,w);
    }
    
    spfa();
    
    printf("Scenario #%d:
    ",cas++);
    printf("%d
    
    ",dist[n]);
    }
    return 0;
    }
    

      

  • 相关阅读:
    【题解】魔术棋子
    NHOI2019小结
    【题解】滑雪
    【题解】最大平台
    【题解】洪水
    【题解】N皇后问题
    【题解】四色定理
    使用Docker快速搭建Jenkins
    使用Docker快速搭建Gitlab
    测试用Docker Swarm环境搭建
  • 原文地址:https://www.cnblogs.com/alan-W/p/5664283.html
Copyright © 2011-2022 走看看