社区讨论

求助,为什么wa9个,方法错了吗?

P1186玛丽卡参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mi6z2rpm
此快照首次捕获于
2025/11/20 13:10
4 个月前
此快照最后确认于
2025/11/20 13:10
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
struct Edge{
   int v,w,next;
}e[1000005];
int tot,n,m,head[1005],x,y,z,dis[1005],u,d[1005];
bool book[1005],check[1005];
priority_queue< pii,vector<pii>,greater<pii> >q;
inline void add(int u,int v,int w)
{
    e[++tot].v=v;
    e[tot].w=w;
    e[tot].next=head[u];
    head[u]=tot;
}
int main()
{
    memset(check,false,sizeof(check));
    memset(head,-1,sizeof(head));
    memset(book,false,sizeof(book));
    memset(d,0x3f,sizeof(d));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;++i)
     {
     	scanf("%d%d%d",&x,&y,&z);
     	add(x,y,z);
     	add(y,x,z);
     }
    memset(dis,0x3f,sizeof(dis));
    dis[1]=0;
    q.push(make_pair(0,1));
    while(!q.empty())
    {
        u=q.top().second;
        q.pop();
        if(book[u]) continue;
        book[u]=true;
        for(int i=head[u];i!=-1;i=e[i].next)
         if(dis[e[i].v]>dis[u]+e[i].w)
          {
          	dis[e[i].v]=dis[u]+e[i].w;
          	if(check[e[i].v]) d[e[i].v]=min(d[e[i].v],d[e[i].v]-(dis[u]+e[i].w));
              check[e[i].v]=true;
            q.push(make_pair(dis[e[i].v],e[i].v)); 
          }
          else
          d[e[i].v]=min(d[e[i].v],dis[u]+e[i].w-dis[e[i].v]);
    }
    int ans=-1;
    //for(int i=1;i<=n;++i) printf("%d ",dis[i]);
    for(int i=2;i<=n;++i) if(!check[i]) d[i]=0;
    for(int i=2;i<=n;++i) ans=max(ans,d[i]);
     printf("%d",dis[n]+ans);
     return 0;
 }

回复

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

正在加载回复...