zoukankan      html  css  js  c++  java
  • UVA 558 Wormholes

    UVA_558

        这个题目实际上就是在让我们判断原图是否存在负圈,如果使用SPFA的话,当一个点的入队次数大于N时,就可以说明原图存在负圈了。

    #include<stdio.h>
    #include<string.h>
    #define MAXD 1010
    #define MAXM 2010
    #define INF 1000000000
    int d[MAXD], q[MAXD], inq[MAXD], inedq[MAXD];
    int N, M, first[MAXD], e, next[MAXM], v[MAXM], w[MAXM];
    void add(int a, int b, int c)
    {
    v[e] = b;
    w[e] = c;
    next[e] = first[a];
    first[a] = e;
    e ++;
    }
    void init()
    {
    int i, a, b, c;
    scanf("%d%d", &N, &M);
    memset(first, -1, sizeof(first));
    e = 0;
    for(i = 0; i < M; i ++)
    {
    scanf("%d%d%d", &a, &b, &c);
    add(a, b, c);
    }
    }
    int SPFA()
    {
    int i, u, front, rear;
    front = rear = 0;
    for(i = 0; i < N; i ++)
    d[i] = INF;
    d[0] = 0;
    memset(inq, 0, sizeof(inq));
    memset(inedq, 0, sizeof(inedq));
    q[rear ++] = 0;
    while(front != rear)
    {
    u = q[front ++];
    if(front > N)
    front = 0;
    inq[u] = 0;
    for(i = first[u]; i != -1; i = next[i])
    if(d[u] + w[i] < d[v[i]])
    {
    d[v[i]] = d[u] + w[i];
    if(!inq[v[i]])
    {
    q[rear ++] = v[i];
    if(rear > N)
    rear = 0;
    inq[v[i]] = 1;
    if(inedq[v[i]] ++ > N)
    return 1;
    }
    }
    }
    return 0;
    }
    int main()
    {
    int t;
    scanf("%d", &t);
    while(t --)
    {
    init();
    if(SPFA())
    printf("possible\n");
    else
    printf("not possible\n");
    }
    return 0;
    }


  • 相关阅读:
    JPA常见坑
    IDEA的快捷键使用
    java注解
    @ResponseBody注解之返回json
    mybatis坑之Integer值为null
    Java后端之SQL语句
    SSM项目配置swaggerUI
    mybatis入门案例2
    mybatis入门案例
    部署本地服务器的前端及后端
  • 原文地址:https://www.cnblogs.com/staginner/p/2218393.html
Copyright © 2011-2022 走看看