1860

来源:互联网 发布:nlpir java 使用 编辑:程序博客网 时间:2024/05/18 00:35
#include <cstdio>using namespace std;const int MAX = 110;struct squeue{public:squeue(): front(0), rear(0){};bool empty(){return front == rear;}bool enqueue(const int x){const int next = (rear + 1) % MAX;if(front == next){return false;}mem[rear] = x;rear = next;return true;}bool dequeue(int &x){if(empty()){return false;}x = mem[front];front = (front + 1) % MAX;return true;}private:int front, rear;int mem[MAX];};struct edge{int v;double rate;double com;edge *next;};int n, m, s;double v;edge *g[MAX];edge mem[2 * MAX];int index;void build(){scanf("%d%d%d%lf", &n, &m, &s, &v);for(int i = 0; i < m; ++i){int v1, v2;double r1, c1, r2, c2;scanf("%d%d%lf%lf%lf%lf", &v1, &v2, &r1, &c1, &r2, &c2);edge *tmp1 = &mem[index];++index;tmp1 ->next = g[v1];g[v1] = tmp1;tmp1 ->v = v2;tmp1 ->rate = r1;tmp1 ->com = c1;edge *tmp2 = &mem[index];++index;tmp2 ->next = g[v2];g[v2] = tmp2;tmp2 ->v = v1;tmp2 ->rate = r2;tmp2 ->com = c2;}}bool spfa(){squeue q;double dist[MAX] = {0.0};dist[s] = v;bool inque[MAX] = {false};inque[s] = true;q.enqueue(s);int acc[MAX] = {0};acc[s] = 1;while(!q.empty()){int u;q.dequeue(u);inque[u] = false;for(edge *p = g[u]; p; p = p ->next){const int w = p ->v;if(dist[w] < (dist[u] - p ->com) * p ->rate){dist[w] = (dist[u] - p ->com) * p ->rate;if(!inque[w]){++acc[w];if(acc[w] > n){return true;}inque[w] = true;q.enqueue(w);}}}}return false;}int main(){build();if(spfa()){printf("YES\n");}else{printf("NO\n");}return 0;}

 
原创粉丝点击