2

2021.8.26北高暑训

今天上午我们接触了单源最短路

我只看懂了dijkstra的,是以贪心为基础每次用最近的一个点去更新其他点到起点的距离

例题

#include<bits/stdc++.h>
using namespace std;
priority_queue< pair <int,int > >q;
int n,m,s,d[5000010];
bool vis[5000010];
int head[5000010],to[5000010],next[5000010],edge[5000010],cnt;
void add(int x,int y,int v)
{
    cnt++;
    to[cnt]=y;
    edge[cnt]=v;
    next[cnt]=head[x];
    head[x]=cnt;
}
void dijkstra()
{
    for(int i=1;i<=n;i++)
    {
        d[i]=2147483647;
    }
    memset(vis,0,sizeof(vis));
    d[s]=0;
    q.push(make_pair(0,s));
    while(q.size())
    {
        int x=q.top().second;
        q.pop();
        if(vis[x])
        {
            continue;
        }
        vis[x]=1;
        for(int i=head[x];i;i=next[i])
        {
            int y=to[i],v=edge[i];
            if(d[y]>d[x]+v)
            {
                d[y]=d[x]+v;
                q.push(make_pair(-d[y],y));
            }
        }
    }
}
int main()
{
    scanf("%d%d%d",&n,&m,&s);
    int x,y,v;
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&v);
        add(x,y,v);
    }
    dijkstra();
    for (int i=1;i<=n;i++)
    {
        printf("%d ",d[i]);
    }
    return 0;
}

下午老师讲了二分因为我在老师讲的时候太累了,睡着了,没有听到,于是我的二分全是向zx同学学习的

二分就是如同猜数游戏的思想般取一个平均值假设它为答案再去检查它是大了还是小了之类的,适用于求最大值最小最小值最大等问题。

伪代码如下

while(l<=r)
{
    mid=(l+r)>>1;
    if(cheak(mid))
    {
         l=mid+1;
         ans=mid;
    }
    else
   {
         r=mid-1;
   }      
}    

今天又TM是开森的一天呢!

posted @ 2021-08-26 23:30  摩托鸭  阅读(35)  评论(0)    收藏  举报
Live2D