BZOJ 1202 贪心的商人

来源:互联网 发布:lstm python实现 编辑:程序博客网 时间:2024/06/11 00:01

差分约束系统

#include <iostream>#include <cstring>#include <cstdlib>#include <algorithm>#include <vector>#include <queue>#include <cmath>#include <cstdio>using namespace std;const int maxn = 1000 + 10;const int INF = 100000000;int n , m;struct Edge{    int from,to,dist;    Edge(int u,int v,int d) : from(u),to(v),dist(d) { }};vector<Edge> edges;vector<int> G[maxn];int d[maxn];int p[maxn];void init(){    for(int i=0;i<=n;i++)        G[i].clear();    edges.clear();}void AddEdge(int from,int to,int dist){    edges.push_back(Edge(from,to,dist));    int M = edges.size();    G[from].push_back(M-1);}int inq[maxn];int cnt[maxn];bool SPFA(int s){    queue<int>Q;    memset(inq,0,sizeof(inq));    memset(cnt,0,sizeof(cnt));    for(int i=0;i<=n;i++)        d[i] = INF;    d[s] = 0;    inq[s] = 1;    Q.push(s);    while(!Q.empty())    {        int u = Q.front();Q.pop();        inq[u] = 0;        for(int i=0;i<G[u].size();i++)        {            Edge& e = edges[G[u][i]];            if(d[u] < INF && d[e.to] > d[u] + e.dist)            {                d[e.to] = d[u] + e.dist;                p[e.to] = G[u][i];                if(!inq[e.to])                {                    Q.push(e.to);                    inq[e.to] = 1;                    if(++cnt[e.to] > n) return false;                }            }        }    }    return true;}int main(){    int T;    scanf("%d",&T);    while(T--){scanf("%d%d",&n,&m);init();int u,v,w;for(int i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&w);AddEdge(u-1,v,w);AddEdge(v,u-1,-w);}if(SPFA(0)) cout<<"true"<<endl;else cout<<"false"<<endl;}    return 0;}

0 0