poj1364-还是建模

来源:互联网 发布:js获取元素的高度 编辑:程序博客网 时间:2024/05/01 04:47

根据题意此题是< 和> 的关系,但是若是想用差分约束,必须是>= 或者<=。

题目给出条件是整数,这就是提示,所以如果>c那么就>=c-1,同理<也是。

知道了这,直接判有没有负环就行了,不要忘了多加一个源点,保持图的联通性。。。。

 

 

代码:

 

#include <stdio.h>#define maxN 205//最大顶点数,这里是s[i]#define inf 0x7fffffffstruct 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;//输入的nchar 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);}elseaddEdge(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");}elseprintf("lamentable kingdom\n");}return 0;}


 

原创粉丝点击