淼一淼A+B problem

鲁迅:这可是道难题呢!

鲁迅:我没说过这话,不过确实在理。


某改题毕,但见LOJ之上有数「A+B」之AC记录。余亦尝闻A+B之趣味无穷,遂兴起而码之。

少顷,AC之,吾心所畅。

#include<iostream>
#include<cstdio>
#include<algorithm>
#define rint register int
using namespace std;
int a,b,tot,first[12],cnt,ans=0,fa[12];
struct node{int u,v,w,nxt;}edge[12];
inline bool cmp(node uu,node vv){return uu.w<vv.w;}
inline void add(int uu,int vv,int ww)
{
    edge[++tot]=(node){uu,vv,ww,first[uu]};
    first[uu]=tot;
}
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
inline void kruskal()
{
    int sum=0;
    sort(edge+1,edge+tot+1,cmp);
    for(rint i=1;i<=cnt;++i)fa[i]=i;
    for(rint i=1;i<=tot;++i)
    {
        int x=find(edge[i].u),y=find(edge[i].v);
        if(x!=y)
        {
            fa[y]=x;sum++;
            ans+=edge[i].w;
        }
        if(sum==cnt-1)return ;
    }
}
int main()
{
    scanf("%d %d",&a,&b);
    cnt=3;add(1,2,a),add(2,1,a);
    add(3,2,b),add(2,3,b);
    kruskal();
    cout<<ans<<endl;
    return 0;
}
Kruskal
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rint register int
using namespace std;
int a,b,tot,first[12],cnt,ans=0;
int dist[12];
bool vis[12];
struct node{int u,v,w,nxt;}edge[12];
inline void add(int uu,int vv,int ww)
{
    edge[++tot]=(node){uu,vv,ww,first[uu]};
    first[uu]=tot;
}
inline void dijkstra(int x)
{
    memset(dist,0x7f,sizeof(dist));
    dist[x]=0;
    for(rint i=1;i<cnt;++i)
    {
        int k=0;
        for(rint j=1;j<=cnt;++j)
            if(!vis[j]&&(k==0||dist[j]<dist[k]))
                k=j;
        vis[k]=1;
        for(rint j=first[k];j;j=edge[j].nxt)
        {
            int y=edge[j].v;
            dist[y]=min(dist[y],edge[j].w+dist[k]);
        }
    }
    return ;
}
int main()
{
    scanf("%d %d",&a,&b);
    cnt=3;add(1,2,a),add(2,3,b);
    dijkstra(1);
    cout<<dist[3]<<endl;
    return 0;
}
dijkstra
#include<iostream>
#include<cstdio>
#include<algorithm>
#define rint register int
using namespace std;
int a,b,l,r;
int main()
{
    l=1,r=100000000;
    scanf("%d %d",&a,&b);
    while(l<=r)
    {
        int mid=(l+r)>>1;
        if(a+b>mid)l=mid+1;
        else r=mid-1;
    }
    cout<<l<<endl;
    return 0;
}
二分答案
原文地址:https://www.cnblogs.com/xingmi-weiyouni/p/11377727.html