社区讨论

原数据最后一个点WA,hack全wa求问题

P1073[NOIP 2009 提高组] 最优贸易参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhj1m5qh
此快照首次捕获于
2025/11/03 19:14
4 个月前
此快照最后确认于
2025/11/03 19:14
4 个月前
查看原帖
spfa+分层图
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
    register int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=(x<<3)+(x<<1)+(c^48); 
        c=getchar();
    }
    return x*f;
}
const int maxn=1e5+10,maxm=1e6+10;
int head[maxn*3],n,m,W[maxn*3],cnt,dis[maxn*3],vis[maxn*3];
struct node{
    int v,w,nxt;  
}edge[maxm*3];
void addedge(int u,int v,int w)
{
    edge[++cnt].v=v;
    edge[cnt].w=w;
    edge[cnt].nxt=head[u];
    head[u]=cnt;
}
deque<int> q;
void spfa()
{
    q.push_front(1);
    memset(dis,-127,sizeof(dis));
    //cout<<dis[1];
    dis[1]=0;
    vis[1]=1;
    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,w=edge[i].w;
            if(dis[v]<dis[u]+w)
            {
                dis[v]=dis[u]+w;
                if(!vis[v]) 
                {
                    vis[v]=1;
                    if(dis[v]>dis[q.front()]) q.push_front(v);
                    else q.push_back(v);
                }
            }
        }
    }
}
signed main()
{
	n=read(),m=read();
    for(int i=1;i<=n;i++)
    {
        W[i]=read();
        addedge(i,i+n,-W[i]);addedge(i+n,i+2*n,W[i]);
    }
    for(int i=1;i<=m;i++)
    {
        int x=read(),y=read(),z=read();
        addedge(x,y,0);addedge(x+n,y+n,0);addedge(x+2*n,y+2*n,0);
        if(z==2) addedge(y,x,0);addedge(y+n,x+n,0);addedge(y+2*n,x+2*n,0);
    }
    spfa();
    cout<<max(dis[n],dis[3*n]);
	return 0;
}
原数据最后一个: 2 1
2 1
1 2 1 之前有讨论说是赋初值的问题,但是没有讲为什么,+hack全错,求挑错

回复

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

正在加载回复...