社区讨论

初学图论蒟蒻求助。。。

P2951[USACO09OPEN] Hide and Seek S参与者 5已保存回复 9

讨论操作

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

当前回复
9 条
当前快照
1 份
快照标识符
@mi7dkx4y
此快照首次捕获于
2025/11/20 19:56
4 个月前
此快照最后确认于
2025/11/20 19:56
4 个月前
查看原帖
交了两份代码,都是70。。。
普通dijkstra
CPP
#include <bits/stdc++.h>

using namespace std;
struct Node
{
    int v,c;
    Node *next;
}*h[20005],pool[50005];
int tot=0;
void adde(int u,int v,int c)
{
    Node *p=&pool[++tot];
    p->v=v;
    p->c=c;
    p->next=h[u];
    h[u]=p;
}
int vis[20005],d[20005];
int n,m,s;
void dijkstra()
{
    memset(d,0x3f3f3f3f,sizeof(d));
    int u=s;
    d[u]=0;
    vis[u]=1;
    for(int i=1;i<=n;i++)
    {
        for(Node *p=h[u];p;p=p->next)
        {
            if(vis[p->v]==0&&d[p->v]>d[u]+p->c)
            {
                d[p->v]=d[u]+p->c;
            }
        }
        int mindis=0x3f3f3f3f;
        for(int j=1;j<=n;j++)
        {
            if(vis[j]==0&&d[j]<mindis)
            {
                mindis=d[j];
                u=j;
            }
        } 
        vis[u]=1;
    }
}

int main()
{
    cin >> n >> m;
    for(int i=1;i<=m;i++)
    {
        int ec,ed;
        scanf("%d%d",&ec,&ed);
        adde(ec,ed,1);
        adde(ed,ec,1);
    } 
    s=1;
    dijkstra();
    int ans=0,tot=0,id;
    for(int i=2;i<=n;i++)
    {
        ans=max(ans,d[i]);
    }
    for(int i=n;i>=2;i--)
    {
        if(d[i]==ans)
        {
            id=i;
            tot++;
        } 
    }
    cout << id << " " << ans << " " <<tot;
    return 0;
}
3TLE。。。 dijkstra+priority queue
CPP
#include <bits/stdc++.h>

using namespace std;
struct Node
{
    int v,c;
    Node *next;
}*h[20005],pool[50005];
int tot=0;
void adde(int u,int v,int c)
{
    Node *p=&pool[++tot];
    p->v=v;
    p->c=c;
    p->next=h[u];
    h[u]=p;
}
int vis[20005],d[20005];
int n,m,s;
struct Queue
{
    int id,dis;
    bool operator<(const Queue t) const
    {
        return dis>t.dis;
    }
}; 
priority_queue <Queue> q;
Queue tmp;
void dijkstra()
{
    memset(d,0x3f3f3f3f,sizeof(d));
    d[s]=0;
    tmp.id=s;
    tmp.dis=0;
    q.push(tmp);
    while(!q.empty())
    {
        tmp=q.top();
        q.pop();
        int u=tmp.id;
        if(vis[u]==1)
            continue;
        vis[u]=1;
        for(Node *p=h[u];p;p=p->next)
        {
            if(vis[p->v]==0&&d[p->v]>d[u]+p->c)
            {
                d[p->v]=d[u]+p->c;
                tmp.id=p->v;
                tmp.dis=d[p->v];
                q.push(tmp); 
            }
        }
    } 
}

int main()
{
    cin >> n >> m;
    for(int i=1;i<=m;i++)
    {
        int ec,ed;
        scanf("%d%d",&ec,&ed);
        adde(ec,ed,1);
        adde(ed,ec,1);
    } 
    s=1;
    dijkstra();
    int ans=0,tot=0,id;
    for(int i=2;i<=n;i++)
    {
        ans=max(ans,d[i]);
    }
    for(int i=n;i>=2;i--)
    {
        if(d[i]==ans)
        {
            id=i;
            tot++;
        } 
    }
    cout << id << " " << ans << " " <<tot;
    return 0;
} 
2TLE+1WA(很神奇)

回复

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

正在加载回复...