hdu1142_hdu1001

hdu1142_hdu1001这道题纠结了好久~~~最后发现最短路的算法求错了~~~可是以前用此代码AC了好几道题了~~~汗~~求指点~先是最后ac代码:#include#include#include#include#defineINF1000010010usingnamespacestd;intd[1005];intvis[1005];intw[1005][1005];


Jetbrains全系列IDE稳定放心使用

这道题纠结了好久~~~最后发现最短路的算法求错了~~~

可是以前用此代码AC了好几道题了~~~汗~~求指点~

先是最后ac代码:

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define INF 1000010010
using namespace std;
int d[1005];
int vis[1005];
int w[1005][1005];
int s[1005];
void init(int n)
{
    memset(s,0,sizeof(s));
    memset(vis,0,sizeof(vis));
    int i,j;
    for(i=0;i<=n;i++)
    {
        for(j=0;j<=n;j++)
        {
            w[i][j]=INF;
            if(i==j)
                w[i][j]=0;
        }
        d[i]=INF;
    }
}
int DFS(int k,int n)
{
    if(s[k])
        return s[k];
     if(k == 2)
        return 1;
    for(int i=1; i<=n; i++)
     {
         if(w[k][i]!=INF && d[k]>d[i])
            s[k]+=DFS(i,n);
   }
    return s[k];
}
struct cmp
{
    bool operator()(int a,int b)
    {
        return a>b;
    }
};
int main()
{
    int n,m;
    while(scanf("%d",&n),n!=0)
    {
        init(n);
        scanf("%d",&m);
        int i,a,b,d1;
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&d1);
            if(d1<w[a][b])
                w[a][b]=w[b][a]=d1;
        }

        d[2]=0;
        //priority_queue<int,vector<int>,cmp> q;
        typedef pair<int,int> pii;
        priority_queue<pii,vector<pii>,greater<pii> > q;
        q.push(make_pair(d[2],2));
        while(!q.empty())
        {
            pii t1=q.top();
            q.pop();
            int t=t1.second;
            if(vis[t])
                continue;
            vis[t]=1;
            for(i=1;i<=n;i++)
            {
                if(!vis[i]&&d[i]>d[t]+w[t][i])
                {
                    d[i]=d[t]+w[t][i];
                    q.push(make_pair(d[i],i));
                }
            }
        }

        printf("%d\n",DFS(1,n));

    }
    return 0;
}

然后是WA的代码:

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define INF 1000010010
using namespace std;
int d[1005];
int vis[1005];
int w[1005][1005];
int s[1005];
void init(int n)
{
    memset(s,0,sizeof(s));
    memset(vis,0,sizeof(vis));
    int i,j;
    for(i=0;i<=n;i++)
    {
        for(j=0;j<=n;j++)
        {
            w[i][j]=INF;
            if(i==j)
                w[i][j]=0;
        }
        d[i]=INF;
    }
}
int DFS(int k,int n)
{
    if(s[k])
        return s[k];
     if(k == 2)
        return 1;
    for(int i=1; i<=n; i++)
     {
         if(w[k][i]!=INF && d[k]>d[i])
            s[k]+=DFS(i,n);
   }
    return s[k];
}
struct cmp
{
    bool operator()(int a,int b)
    {
        return d[a]>d[b];             //此处修改
    }
};
int main()
{
    int n,m;
    while(scanf("%d",&n),n!=0)
    {
        init(n);
        scanf("%d",&m);
        int i,a,b,d1;
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&d1);
            if(d1<w[a][b])
                w[a][b]=w[b][a]=d1;
        }

        d[2]=0;
        priority_queue<int,vector<int>,cmp> q;         //此处修改
        //typedef pair<int,int> pii;
        //priority_queue<pii,vector<pii>,greater<pii> > q;
        q.push(2);
        while(!q.empty())
        {
            int t=q.top();
            q.pop();
            //int t=t1.second;
            if(vis[t])
                continue;
            vis[t]=1;
            for(i=1;i<=n;i++)
            {
                if(!vis[i]&&d[i]>d[t]+w[t][i])
                {
                    d[i]=d[t]+w[t][i];
                    q.push(i);              //此次修改~~
                }
            }
        }

        printf("%d\n",DFS(1,n));

    }
    return 0;
}

感觉对的~~但是wa了 难道priority queue 用法有误么~~

~~知道问题了~~原来是priority_queue有问题~看看实现就知道了~q.push().q.pop() 都会排序

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187309.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • redis穿透 击穿_redis缓存穿透和雪崩

    redis穿透 击穿_redis缓存穿透和雪崩​1、redis雪崩、穿透、击穿的原因和解决方案1)雪崩:多个key在某一时间同时失效,导致数据库压力过大解决方案:不同的key设置不同的过期时间,尽量错开2)穿透:在访问某个key时缓存中不存在,导致每次查询都会访问数据库解决方案:第一次访问时如果key不存在,则在缓存中设置一个空值,并设置较短的过期时间3)击穿:单个key缓存突然失效,这时大量的请求进行访问,导致数据压力过大解决方案:1、双重检索机制:某个key只让一个线程查询,阻塞其他线程 privatestati

    2022年9月14日
  • c#savefiledialog默认文件名_save用法词组

    c#savefiledialog默认文件名_save用法词组#region 保存对话框   private void SaveFileDialog()  {      //string localFilePath, fileNameExt, newFileName, FilePath;       SaveFileDialog saveFileDialog1 = new SaveFileDialog();       

    2022年10月8日
  • jar中没有主清单属性啥意思啊_maven打jar包无主清单属性

    jar中没有主清单属性啥意思啊_maven打jar包无主清单属性在maven-assembly-plugin插件配置中添加,如下内容:maven-assembly-plugin

    2022年9月5日
  • django通用视图通俗讲解_django queryset合并

    django通用视图通俗讲解_django queryset合并前言上篇我们通过mixin可以非常方便的实现一些CURD操作。实际上针对这些mixin,DRF还进一步的进行了封装,放到generics下。有以下generic类视图:generics.ListA

    2022年7月31日
  • img图片加载出错处理[通俗易懂]

    img图片加载出错处理[通俗易懂]为了美观当网页图片不存在时不显示叉叉图片当在页面显示的时候,万一图片被移动了位置或者丢失的话,将会在页面显示一个带X的图片,很是影响用户的体验。即使使用alt属性给出了”图片XX”的提示信息,也起不了多大作用。其实,可以这样处理:当图片不存在的时候,会触发onerror事件,我们可以在该事件中做一下补救的工作,比如:1、让这个图片元素隐藏:imgsrc=”图片的url地址”

    2022年7月26日
  • COleVariant和VARIANT转换为CString类型

    COleVariant和VARIANT转换为CString类型COleVariant是数据库常用到的数据类型。它可以是字串,整型值,日期等。知道怎样将它转换为CString很有用处。        设有CString A; COleVariant B; 来看看怎样将COleVariant转换为CString:        switch(B.vt){            case VT_BSTR:  A=B.bstrVal; bre

    2022年7月18日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号