zoukankan      html  css  js  c++  java
  • poj 3259Wormholes (spfa 、bell)

    http://poj.org/problem?id=3259

    看了好久才知道那个虫洞 是可以把人带回去 而且时间也会回到过去 判断是否有负权回路  spfa看是否有一个点进入队列等于n次

    bell-ford

    View Code
     1 #include <iostream>
     2 #include<cstdio>
     3 #include<string.h>
     4 #include<queue>
     5 #define INF 0x3f3f3f
     6 using namespace std;
     7 struct node
     8 {
     9     int u,v,t;
    10 }q[5000];
    11 int dis[501];
    12 int bellford(int n,int m)
    13 {
    14     int i,j;
    15     memset(dis,0,sizeof(0));
    16     for(i = 1; i <= n ; i++)
    17     {
    18         int flag = 0;
    19         for(j = 1 ; j <= m ; j++)
    20         if(dis[q[j].v]>dis[q[j].u]+q[j].t)
    21         {
    22             dis[q[j].v] = dis[q[j].u]+q[j].t;
    23             flag = 1;
    24         }
    25         if(!flag)
    26         break;
    27     }
    28     for(j = 1; j <= m ; j++)
    29     {
    30         if(dis[q[j].v]>dis[q[j].u]+q[j].t)
    31             return 1;
    32     }
    33     return 0;
    34 }
    35 int main()
    36 {
    37     int i,j,k,n,m,t,w1,o,a,b,c;
    38     scanf("%d",&t);
    39     while(t--)
    40     {
    41         scanf("%d%d%d",&n,&m,&w1);
    42         o = 0;
    43         for(i = 1 ; i <= m ; i++)
    44         {
    45             scanf("%d%d%d",&a,&b,&c);
    46             o++;
    47             q[o].u = a;
    48             q[o].v = b;
    49             q[o].t = c;
    50             o++;
    51             q[o].u = b;
    52             q[o].v = a;
    53             q[o].t = c;
    54         }
    55         for(i = 1 ; i <= w1 ; i++)
    56         {
    57             scanf("%d%d%d",&a,&b,&c);
    58             o++;
    59             q[o].u = a;
    60             q[o].v = b;
    61             q[o].t = -c;
    62         }
    63        if(bellford(n,o))
    64        printf("YES\n");
    65        else
    66        printf("NO\n");
    67     }
    68     return 0;
    69 }
    View Code
     1 #include <iostream>
     2 #include<cstdio>
     3 #include<string.h>
     4 #include<queue>
     5 #define INF 0x3f3f3f
     6 using namespace std;
     7 struct node
     8 {
     9     int v,w,next;
    10 }men[30000];
    11 int first[501],t,f[501],dis[501],c[501];
    12 void init()
    13 {
    14     t = 0;
    15     memset(first,-1,sizeof(first));
    16 }
    17 void add(int u,int v,int w)
    18 {
    19     men[t].v = v;
    20     men[t].w = w;
    21     men[t].next = first[u];
    22     first[u] = t;
    23     t++;
    24 }
    25 void spfa(int n)
    26 {
    27     int i,j,k,flag = 1;
    28     memset(f,0,sizeof(f));
    29     memset(c,0,sizeof(c));
    30     queue<int>q;
    31     for(i = 1; i <= n ; i++)
    32     dis[i] = INF;
    33     dis[1] = 0;
    34     q.push(1);
    35     f[1] = 1;
    36     c[1] = 1;
    37     while(!q.empty())
    38     {
    39         k = q.front();
    40         if(c[k]==n)
    41         {
    42             flag = 0;
    43             break;
    44         }
    45 
    46         q.pop();
    47         f[k] = 0;
    48         for(i = first[k];i!=-1 ; i = men[i].next)
    49         {
    50             if(dis[k]+men[i].w<dis[men[i].v])
    51             {
    52                 dis[men[i].v]=dis[k]+men[i].w;
    53                 if(!f[men[i].v])
    54                 {
    55                     f[men[i].v] = 1;
    56                     q.push(men[i].v);
    57                     c[men[i].v]++;
    58                 }
    59             }
    60         }
    61     }
    62     if(!flag)
    63     printf("YES\n");
    64     else
    65     printf("NO\n");
    66 }
    67 int main()
    68 {
    69     int i,j,k,n,m,a,b,c,w,p;
    70     scanf("%d",&p);
    71     while(p--)
    72     {
    73         scanf("%d%d%d",&n,&m,&w);
    74         init();
    75         for(i = 1; i <= m ; i++)
    76         {
    77             scanf("%d%d%d",&a,&b,&c);
    78             add(a,b,c);
    79             add(b,a,c);
    80         }
    81         for(i = 1; i <= w ; i++)
    82         {
    83             scanf("%d%d%d",&a,&b,&c);
    84             add(a,b,-c);
    85         }
    86         spfa(n);
    87     }
    88     return 0;
    89 }

    spfa

  • 相关阅读:
    C# -- HttpWebRequest 和 HttpWebResponse 的使用
    C# -- Lambda 表达式的使用
    ASP.NET -- WebForm -- HttpRequest类的方法和属性
    ASP.NET -- WebForm -- HttpResponse 类的方法和属性
    C# -- 索引器、枚举类型
    C#设计模式之七桥接模式(Bridge Pattern)【结构型】
    C#设计模式之六适配器模式(Adapter Pattern)【结构型】
    C#设计模式之五原型模式(Prototype Pattern)【创建型】
    C#设计模式之四建造者模式(Builder Pattern)【创建型】
    C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】
  • 原文地址:https://www.cnblogs.com/shangyu/p/2628207.html
Copyright © 2011-2022 走看看