zoukankan      html  css  js  c++  java
  • poj1135Domino Effect——最短路

    题目:http://poj.org/problem?id=1135

    先在图中跑一遍最短路,最后倒的牌可能是dis值最大的点,也可能是在dis值最大的点所连的边上,尝试一下即可;

    坑:n=1的时候输出点1。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    queue<int>q;
    int n,m,head[505],ct,dis[505],t;
    double ans;
    bool in[505];
    struct N{
        int to,next,w;
        N(int t=0,int n=0,int o=0):to(t),next(n),w(o) {}
    }edge[250005];
    int main()
    {
        while(scanf("%d%d",&n,&m)==2)
        {
            t++;
            if(!n&&!m)return 0;
            ct=0;
            memset(head,0,sizeof head);
            memset(dis,2,sizeof dis);
            memset(in,0,sizeof in);
            for(int i=1;i<=m;i++)
            {
                int x,y,z;
                scanf("%d%d%d",&x,&y,&z);
                edge[++ct]=N(y,head[x],z);head[x]=ct;
                edge[++ct]=N(x,head[y],z);head[y]=ct;
            }
            while(q.size())q.pop();
            dis[1]=0;q.push(1);in[1]=1;
            while(q.size())
            {
                int x=q.front();q.pop();
                in[x]=0;
                for(int i=head[x];i;i=edge[i].next)
                {
                    int u=edge[i].to;
                    if(dis[x]+edge[i].w<dis[u])
                    {
                        dis[u]=dis[x]+edge[i].w;
                        if(!in[u])in[u]=1,q.push(u);
                    }
                }
            }
            int k=0,dk=0;ans=0;
            for(int i=1;i<=n;i++)
                if(dis[i]>=ans)//>=以处理n=1的情况 
                {
                    ans=dis[i];
                    k=i;
                }
            for(int i=head[k];i;i=edge[i].next)
            {
                int u=edge[i].to;
                if(dis[u]+edge[i].w>dis[k]&&ans<1.0*(edge[i].w-dis[k]+dis[u])/2+dis[k])
                    ans=1.0*(edge[i].w-dis[k]+dis[u])/2+dis[k],dk=u;
            }
            printf("System #%d 
    ",t);
            if(dk>k)swap(dk,k);
            if(ans==dis[k])
                printf("The last domino falls after %.1lf seconds, at key domino %d.
    ",ans,k);
            else
                printf("The last domino falls after %.1lf seconds, between key dominoes %d and %d.
    ",ans,dk,k);
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    高级查询query
    elasticsearch 复合查询
    第八篇 elasticsearch链接mysql自动更新数据库
    第七篇 elasticsearch 链接mysql不会更新
    第六篇 elasticsearch express 删除索引数据
    koa1创建项目
    第五篇 elasticsearch express插入数据
    hdu3594 Cactus
    hdu2767 Proving Equivalences
    loj2274 「JXOI2017」加法
  • 原文地址:https://www.cnblogs.com/Zinn/p/8611470.html
Copyright © 2011-2022 走看看