zoukankan      html  css  js  c++  java
  • poj 3259 Wormholes (spfa+判断负权回路+模版)

    面壁:

          细节之处,尽显实力;

    spfa + vector

    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <stack>
    using namespace std;
    
    #define inf 99999999
    #define V 520
    #define NE 6000
    int n,m,w;
    struct node
    {
        int v;
        int val;
    }E;
    vector<node> Node[V+2];
    int spfa(int k)
    {
        int d[V], cnt[V], vis[V];
        for(int j = 1;j <= n;j ++)
        d[j] = inf,cnt[j] = 0,vis[j] = 0;
        d[k] = 0; vis[k] = 1;cnt[k] = 1;
    
        stack<int> p;p.push(k);
        while(!p.empty())
        {
            int u = p.top(); 
    p.pop();vis[u] = 0; int len = Node[u].size(); for(int j = 0;j < len;j ++) { int v = Node[u][j].v; int c=Node[u][j].val; if(d[v] - c > d[u]) { d[v] = c + d[u]; if(!vis[v]) { vis[v] = 1; cnt[v] ++; if(cnt[v] >= n) return 1; p.push(v); } } } } return 0; } int main() { int cs; scanf("%d",&cs); while(cs--) { scanf("%d%d%d",&n,&m,&w); for(int j = 1;j <= n;j ++) Node[j].clear(); while(m--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); E.v = b; E.val = c; Node[a].push_back(E); E.v = a; E.val = c; Node[b].push_back(E); } while(w--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); E.v = b;E.val = -c; Node[a].push_back(E); } if(!spfa(1)) puts("NO"); else puts("YES"); } return 0; }

    spfa + 数组模拟(很有意思的写法)

    #include<stdio.h>
    #include<string.h>
    #define V 510
    #define E 6000
    #define inf 999999999
    
    int pnt[E],nxt[E],cost[E];
    int head[V],e;
    int spfa(int n,int m,int s)
    {
        int dist[V],vis[V],cnt[V];
        for(int i=1;i<=n;i++)
        dist[i]=inf,vis[i]=0,cnt[i]=0;
        dist[s]=0;vis[s]=1;cnt[s]++;
    
        int que[E],top=1; que[0]=s;
        while(top)
        {
            int u=que[--top];vis[u]=0;
            for(int i=head[u];i!=-1;i=nxt[i])
            {
                int v=pnt[i];
                if(dist[v] > dist[u]+cost[i])
                {
                    dist[v]=dist[u]+cost[i];
                    if(!vis[v])
                    {
                        vis[v]=1;cnt[v]++;
                        if( cnt[v] >= n) return 1;
                        que[top++]=v;
                    }
                }
            }
        }
        return 0;
    }
    void add(int u,int v,int c)
    {
        pnt[e]=v; cost[e]=c;
        nxt[e]=head[u];head[u]=e++;
    }
    int main()
    {
        int cs;scanf("%d",&cs);
        while(cs--)
        {
            int n,m,w;e=0;
            memset(head,-1,sizeof(head));
            scanf("%d%d%d",&n,&m,&w);
            while(m--)
            {
                int s,e,c;scanf("%d%d%d",&s,&e,&c);
                add(s,e,c);
                add(e,s,c);
            }
            while(w--)
            {
                int s,e,c;scanf("%d%d%d",&s,&e,&c);
                add(s,e,-c);
            }
            if(spfa(n,e,1))puts("YES");
            else puts("NO");
        }
        return 0;
    }

    bellamn    复杂度(VE) 

    虽然复杂度高点,还是有点情有独钟->__-->

    #include<stdio.h>
    #define V 510
    #define E 6000
    #define inf 999999999
    struct node
    {
        int s,e,c;
    }map[E];
    
    int bellman(int n,int m,int s)
    {
        int dist[V];
        for(int i=1;i<=n;i++)
        dist[i]=inf;dist[s]=0;
        for(int i=1;i<n;i++)
        {
            int flag=0;
            for(int j=0;j<m;j++)
            {
                int u=map[j].s;
                int v=map[j].e;
                int c=map[j].c;
                if(dist[v]>dist[u]+c)
                dist[v]=dist[u]+c;
                flag=1;
            }
            if(!flag) break;
        }
        for(int j=0;j<m;j++)
        {
            int u=map[j].s;
            int v=map[j].e;
            int c=map[j].c;
            if(dist[v]>dist[u]+c)
            return 1;
        }
        return 0;
    }
    int main()
    {
        int cs;scanf("%d",&cs);
        while(cs--)
        {
            int n,m,w,top=0;
            scanf("%d%d%d",&n,&m,&w);
            while(m--)
            {
                int s,e,c;scanf("%d%d%d",&s,&e,&c);
                map[top].s=s,map[top].e=e,map[top++].c=c;
                map[top].s=e,map[top].e=s,map[top++].c=c;
            }
            while(w--)
            {
                int s,e,c;scanf("%d%d%d",&s,&e,&c);
                map[top].s=s,map[top].e=e,map[top++].c=-c;
            }
            if(bellman(n,top,1))puts("YES");
            else puts("NO");
        }
        return 0;
    }
    Just a little, maybe change the world
  • 相关阅读:
    Android JSON解析
    相对靠谱的相册、拍照返回选择程序
    android strings.xml转义字符,注意细节解决
    设置progressBar 背景以及进度条
    Android Launcher简易Launcher开发
    android.os.NetworkOnMainThreadException 异常处理
    AspNetPager 多条件分页查询
    无法解析指定对象的 TargetProperty (UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)“的异常解决
    DefaultButton Deal with users hitting ENTER on your forms
    Setup SSRS in SharePoint Integrated Mode
  • 原文地址:https://www.cnblogs.com/skyming/p/2479362.html
Copyright © 2011-2022 走看看