• LightOJ


    题意:有n个城市,每一个城市有一个拥挤度ai,从一个城市u到另一个城市v的时间为:(au-av)^3,存在负环。问从第一个城市到达第k个城市所话的时间,如果不能到达,或者时间小于3输出?否则输出所花的时间 .

    解析:spfa判断负环  然后dfs标记负环

    如果某个在环内  || d[e,v] == INF || d[e.v] < 3  则输出?

    否则输出d[e.v]

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <queue>
    #include <cmath>
    #include <stack>
    #define mem(a,b) memset(a,b,sizeof(a))
    using namespace std;
    const int maxn = 209, INF = 0x7fffffff;
    int head[maxn], d[maxn], vis[maxn*maxn], des[maxn], ans[maxn], cir[maxn];
    int dot[maxn];
    int n, m, q;
    struct node{
        int u,v,w,next;
    }Node[maxn*maxn];
    
    void add(int u,int v,int w,int i)
    {
        Node[i].u = u;
        Node[i].v = v;
        Node[i].w = w;
        Node[i].next = head[u];
        head[u] = i;
    }
    
    void dfs(int u)
    {
        cir[u] = 1;
        for(int i=head[u]; i!=-1; i=Node[i].next)
            if(!cir[Node[i].v])
                dfs(Node[i].v);
    }
    
    void spfa(int s)
    {
        queue<int> Q;
        for(int i=0; i<=n; i++) d[i] = INF;
        d[s] = 0;
        mem(vis,0);
        Q.push(s);
        vis[s] = 1;
        while(!Q.empty())
        {
            int x = Q.front(); Q.pop();
            vis[x] = 0;
            for(int i=head[x]; i!=-1; i=Node[i].next)
            {
                node e = Node[i];
                if(cir[e.v]) continue;                   //!!!!!!!!!!!呵。。呵。。T了好几发才发现。。。。。
                if(d[e.v] > d[x] + e.w)
                {
                    d[e.v] = d[x] + e.w;
                    if(!vis[e.v])
                    {
                        Q.push(e.v);
                        vis[e.v] = 1;
                        ans[e.v]++;
                        if(ans[e.v] > n) dfs(e.v);
                    }
                }
            }
        }
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        int cnt = 0;
        while(T--)
        {
            mem(cir,0);
            mem(ans,0);
            mem(head,-1);
            scanf("%d",&n);
            for(int i=1; i<=n; i++)
                scanf("%d",&dot[i]);
            scanf("%d",&m);
            for(int i=0; i<m; i++)
            {
                int u, v;
                scanf("%d%d",&u,&v);
                add(u,v,(dot[v]-dot[u])*(dot[v]-dot[u])*(dot[v]-dot[u]),i);
            }
            spfa(1);
            scanf("%d",&q);
            for(int i=0; i<q; i++)
                scanf("%d",&des[i]);
            printf("Case %d:
    ",++cnt);
            for(int i=0; i<q; i++)
                if( cir[des[i]] || d[des[i]] == INF || d[des[i]] < 3)
                    printf("?
    ");
                else
                    printf("%d
    ",d[des[i]]);
    
        }
    
        return 0;
    }
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    Struts2+Spring+Ibatis集成合并
    spring多个定时任务quartz配置
    Quartz作业调度框架
    百度搜索URL参数含义
    代理IP抓取
    解决HttpWebRequest和HtmlAgilityPack采集网页中文乱码问题
    移动端上传头像-相册、拍摄-旋转
    订单倒计时
    css flex布局 实例
    currentTarget与target
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/9162250.html
Copyright © 2020-2023  润新知