社区讨论
原数据最后一个点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 条回复,欢迎继续交流。
正在加载回复...