差分约束 91pts WA#14 求调
查看原帖
差分约束 91pts WA#14 求调
1657369
__liujy楼主2025/7/27 17:00
// P4878 [USACO05DEC] Layout G
#include<bits/stdc++.h>
const int MAXN=1005;
typedef std::pair<int,int> PII;
typedef long long LL;
const LL INF=(1LL<<31);
int n,M_l,M_d,cnt[MAXN];
LL dis[MAXN];
bool vis[MAXN];
std::vector<PII> e[MAXN];
inline void add(int u,int v,int w)
{ e[u].push_back(std::make_pair(v,w)); }
inline bool spfa(int s)
{
    std::fill(vis,vis+n+1,0),
    std::fill(cnt,cnt+n+1,0),
    std::fill(dis,dis+n+1,INF);
    dis[s]=0,vis[s]=1;
    std::queue<int> q;
    q.push(s);
    while(q.size())
    {
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(auto it:e[u])
        {
            int v=it.first,w=it.second;
            if(dis[v]>dis[u]+w)
            {
                dis[v]=dis[u]+w;
                if(!vis[v])
                {
                    vis[v]=1,cnt[v]=cnt[u]+1;
                    if(cnt[v]>=n) return 0;
                    q.push(v);
                }
            }
        }
    }
    return 1;
}
int main()
{
    scanf("%d%d%d",&n,&M_l,&M_d);
    for(int i=1;i<=n;i++) add(0,i,0);
    for(int _=1,u,v,w;_<=M_l;_++)
    {
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
    }
    for(int _=1,u,v,w;_<=M_d;_++)
    {
        scanf("%d%d%d",&u,&v,&w);
        add(v,u,-w);
    }
    if(!spfa(0)) printf("-1\n");
    else if(!spfa(1)) printf("-1\n");
    else printf("%d\n",(dis[n]==INF?-2:dis[n]));
    return 0;
}

回复请 at 我。

2025/7/27 17:00
加载中...