• UVA-10801 Lift Hopping (最短路)


    题目大意及分析:一道简单的最短路。。。好几天没写程序了,憋得难受!!!

    代码如下:

    # include<iostream>
    # include<cstdio>
    # include<cstring>
    # include<vector>
    # include<queue>
    # include<algorithm>
    using namespace std;
    
    const int INF=1<<30;
    
    struct Edge
    {
        int to,w,nxt;
    };
    Edge G[35000];
    int a[5][105],n,t;
    int v[5],head[505],cnt;
    int d[505];
    
    bool read(int &val)
    {
        val=0;
        char c;
        while(c=getchar()){
            if(c=='
    ') return false;
            else if(c==' ') return true;
            else val=val*10+c-'0';
        }
    }
    
    void addEdge(int fr,int to,int w)
    {
        G[cnt].to=to;
        G[cnt].w=w;
        G[cnt].nxt=head[fr];
        head[fr]=cnt++;
    
        G[cnt].to=fr;
        G[cnt].w=w;
        G[cnt].nxt=head[to];
        head[to]=cnt++;
    }
    
    int spfa()
    {
        fill(d,d+500,INF);
        queue<int>q;
        for(int i=0;i<500;i+=100){
            d[i]=0;
            q.push(i);
        }
        while(!q.empty()){
            int u=q.front();
            q.pop();
            for(int i=head[u];i!=-1;i=G[i].nxt){
                int nu=G[i].to;
                if(d[nu]>d[u]+G[i].w){
                    d[nu]=d[u]+G[i].w;
                    q.push(nu);
                }
            }
        }
        int res=INF;
        for(int i=0;i<500;i+=100)
            res=min(res,d[t+i]);
        return res;
    }
    
    int main()
    {
        while(~scanf("%d%d",&n,&t))
        {
            for(int i=0;i<n;++i) scanf("%d",v+i);
            cnt=0;
            memset(head,-1,sizeof(head));
            getchar();
            for(int i=0;i<n;++i){
                a[i][0]=0;
                int val;
                while(read(val))
                {
                    a[i][++a[i][0]]=val;
                }
                a[i][++a[i][0]]=val;
            }
            for(int i=0;i<n;++i)
                for(int j=1;j<=a[i][0];++j)
                    for(int k=j+1;k<=a[i][0];++k)
                        addEdge(i*100+a[i][j],i*100+a[i][k],(a[i][k]-a[i][j])*v[i]);
            for(int i=0;i<100;++i)
                for(int j=0;j<500;j+=100)
                    for(int k=j+100;k<500;k+=100)
                        addEdge(i+j,i+k,60);
            int ans=spfa();
            if(ans==INF)
                printf("IMPOSSIBLE
    ");
            else printf("%d
    ",ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    多时钟域设计——控制信号传输
    时钟与复位
    注意
    有限状态机
    亚稳态
    python读取json文件制作股票价格走势
    python读取csv文件绘制气温图,x轴为日期,并填充颜色
    python读取csv文件数据绘制图像,例子绘制天气每天最高最低气温气象图
    python随机漫步
    python读取txt文件绘制散点图
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/5134831.html
Copyright © 2020-2023  润新知