当前位置:编程学习 > C/C++ >>

poj1364-还是建模

根据题意此题是< 和> 的关系,但是若是想用差分约束,必须是>= 或者<=。
题目给出条件是整数,这就是提示,所以如果>c那么就>=c-1,同理<也是。
知道了这,直接判有没有负环就行了,不要忘了多加一个源点,保持图的联通性。。。。
 
 
代码:
 
[cpp]
#include <stdio.h> 
 
#define maxN 205//最大顶点数,这里是s[i] 
#define inf 0x7fffffff 
 
struct Edge  

    int v, w, next; 
}edge[maxN * 30];//边 
 
int edgeNum;//边总数 
int dis[maxN];//最长路径中的dis[i]代表远点到i的最长距离 
bool vis[maxN];//标示i是否进入队列 
int preEdge[maxN];//同一个起点的上一条边 
int cnt[maxN];//入队列的次数 
int queue[maxN * 30];//模拟队列 
int n,m;//输入的n 
char ch[10]; 
 
void addEdge(int u, int v, int w)//添加新边 

    edge[edgeNum].v = v; 
    edge[edgeNum].w = w; 
    edge[edgeNum].next = preEdge[u];//以u为起点的上一条边 
    preEdge[u] = edgeNum ++; 

 
int spfa()//spfa算法实现 

    int head = 0, tail = 1; 
 
    for (int i = 0; i <= n; ++ i) 
    { 
        dis[i] = inf; 
        vis[i] = false; 
        cnt[i] = 0; 
    } 
    queue[ head] = n + 2; 
    dis[n + 2] = 0; 
    ++ cnt[n + 2]; 
    while (head < tail) 
    { 
        int u = queue[head]; 
        int p = preEdge[u]; 
        vis[u] = true; 
        while (p != -1) 
        { 
            int v = edge[p].v, w = edge[p].w; 
            if (dis[v] > dis[u] + w) 
            { 
                dis[v] = dis[u] + w; 
                if (!vis[v]) 
                { 
                    vis[v] = true; 
                    queue[tail] = v; 
                    tail ++; 
                    if(++cnt[v] > n ) 
                    { 
                        return 1; 
                    } 
 
                } 
 
 
            } 
            p = edge[p].next; 
        } 
        head ++; 
        vis[u] = false; 
    } 
    return 0; 

 
void buildGraph()//建图这也是本题目的关键,建模。。。。 

    edgeNum = 0; 
    for (int i = 0; i <= n + 2; ++ i) 
    { 
        preEdge[i] = -1; 
    } 
    scanf("%d", &m); 
     
    for (int i = 0; i < m; ++ i) 
    { 
        int u, v, w; 
        scanf("%d %d %s %d", &u, &v, ch, &w); 
        if (ch[0] == 'g') 
        { 
            addEdge(u + v, u - 1, - w - 1); 
        } 
        else 
            addEdge(u - 1, u + v, - 1 + w); 
    } 
    for (int i = 1; i <= n; ++ i) 
    { 
        addEdge(n + 2, i, 0); 
    } 
     

 
int main()//主函数 

    while (scanf("%d", &n) != EOF && n) 
    { 
        buildGraph(); 
        if (spfa()) 
        { 
            printf("successful conspiracy\n"); 
        } 
        else 
            printf("lamentable kingdom\n"); 
    } 
    return 0; 


作者:zhang20072844
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,