社区讨论

55分RE求调

P1993小 K 的农场参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhizjzid
此快照首次捕获于
2025/11/03 18:17
4 个月前
此快照最后确认于
2025/11/03 18:17
4 个月前
查看原帖
CPP

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+10;
int head[maxn],tot,n,m,dis[maxn],vis[maxn],cnt[maxn];
struct node{
    int v,w,nxt;
}edge[maxn];
void addedge(int u,int v,int w)
{
    edge[++tot].v=v;
    edge[tot].w=w;
    edge[tot].nxt=head[u];
    head[u]=tot;
}
void spfa(int s)
{
    deque<int>q;
    memset(dis,0x3f,sizeof(dis));
    q.push_front(s); vis[s]=1,dis[s]=0;
    while(!q.empty())
    {
        int u=q.front();q.pop_front();
        vis[u]=0;
        for(int i=head[u];i;i=edge[i].nxt)
        {
            int v=edge[i].v;
            if(dis[v]>dis[u]+edge[i].w)
            {
                dis[v]=dis[u]+edge[i].w;
                if(!vis[v])
                {
                    cnt[v]++;
                    vis[v]=1;
                    if(cnt[v]>n){cout<<"No";exit(0);}
                    if(dis[v]<dis[q.front()]) q.push_front(v);
                    else q.push_back(v);
                }
            }
        }
    }
}
signed main()
{
    cin>>n>>m;
    int op,a,b,c;
    for(int i=1;i<=m;i++)
    {
        cin>>op;
        if(op==1)
        {
            cin>>a>>b>>c;
            addedge(a,b,-c);
        }
        if(op==2)
        {
            cin>>a>>b>>c;
            addedge(b,a,c);
        }
        if(op==3)
        {
            cin>>a>>b;
            addedge(a,b,0);addedge(b,a,0);
        }
    }
    for(int i=1;i<=n;i++) addedge(0,i,0);
    spfa(0);
    cout<<"Yes";
    return 0;
}
//a-b>=c  b-a<=-c b<=a-c
//a-b<=c  a<=b+c
//a-b>=0 b-a>=0

回复

0 条回复,欢迎继续交流。

正在加载回复...