NOIP 模板整理计划 NOIP2017 RP++(持续更新中~)

还有几天就noip2017了,本蒟蒻将noip的模板整理一下,在复习的同时希望也可以帮助到大家,祝愿大家成功1=;

#include<iostream>
using namespace std;
int inf=2147483647
int main()
{
    int Loi_RP=inf;
    while(1)
        Loi_RP++;

    return 0;
}

高精度

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct hh {
  int a[10031],cnt;}c;
void init()
{
    memset(c.a,0,sizeof(c.a));
    c.cnt=0;
    return;
}
hh ff(int v)//将int转为hh型
{
    init();
    int cnt=0;
    while(v) c.a[++cnt]=v%10,v/=10;
    c.cnt=cnt;
    return c;
}
hh zhuan(string s)//将string转为hh型
{
    init();
    int len=s.size();
    for(int i=0;i<len;i++)
        c.a[len-i]=s[i]-'0';
    c.cnt=len;
    return c;
}
hh add(hh a,hh b)// + 
{
    init();
    int len=max(a.cnt,b.cnt);
    for(int i=1;i<=len;i++)
    {
        c.a[i]+=a.a[i]+b.a[i];
        if(c.a[i]>=10)//注意是>= 
        {
            c.a[i]-=10; 
            c.a[i+1]++;
        }
    }
    while(c.a[len+1]) len++;
    c.cnt=len;
    return c;
}

bool cmp(hh a,hh b)
{
    if(a.cnt>b.cnt) return true;
    if(a.cnt<b.cnt) return false;
    for(int i=a.cnt;i>=1;i--)
    if(a.a[i]>b.a[i]) return true;
    else if(a.a[i]<b.a[i]) return false;
    return true;
}

hh chu(string a,int x)//高精除以单精
{
    init();
    int d=0,len=a.size();
    for(int i=0;i<len;i++)//除法是从高位到低位; 
    {
        c.a[i+1]=(a[i]-'0'+d*10)/x;
        d=(d*10+a[i]-'0')%x;
    }
    c.cnt=len;
    int sta=1;
    while(c.a[sta]==0 && sta<c.cnt) sta++;
    for(int i=sta;i<=c.cnt;i++) printf("%d",c.a[i]);
}

hh jian(hh a,hh b)//减
{
    init();
    if(!cmp(a,b))//先比较; 
    {
        printf("-");
        swap(a,b);
    }
    int len=max(a.cnt,b.cnt);
    for(int i=1;i<=len;i++)
    {
        c.a[i]=a.a[i]-b.a[i];
        if(c.a[i]<0)
        {
            a.a[i+1]--;
            c.a[i]+=10;
        }
    }
    while(!c.a[len] && len>1) len--;
    c.cnt=len;
    return c;
}

hh mult(hh a,hh b)//乘
{
    init();
    for(int i=1;i<=a.cnt;i++)
    {
        for(int j=1;j<=b.cnt;j++)
        {
            c.a[i+j-1]+=a.a[i] * b.a[j];//+= 
            c.a[i+j]+=c.a[i+j-1]/10;//+= 
            c.a[i+j-1]%=10;
        }
    }
    int len=a.cnt+b.cnt;
    while(c.a[len]) len++;
    c.cnt=len-1;
    return c;
}


void print(hh s)
{
    while(!s.a[s.cnt] && s.cnt>1) s.cnt--;
    for(int i=s.cnt;i>=1;i--) printf("%d",s.a[i]);
    return; 
}
string s1,s2;
int n;
void solve()
{
    cin>>s1>>n;
    chu(s1,n);
    return;
}

int main() { solve();return 0; }

最短路

堆优化的Dijkstra:

例题:热浪
要求:
图中没有负权;
适用:稀疏图;

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=100001;
int n,m,tot,sx,sy;
int dis[MAXN],nxt[MAXN],fst[MAXN];
bool vis[MAXN];
struct hh
{
    int num,dis;
}a[MAXN];
struct sh
{
    int from,to,cost;
}ma[MAXN];
priority_queue<hh>q;
bool operator < (hh a,hh b)
{
    return a.dis > b.dis;
}

void build(int f,int t,int c)
{
    tot++;
    ma[tot]=(sh){f,t,c};
    nxt[tot]=fst[f];
    fst[f]=tot;
    return;
}

void init()
{
    memset(dis,0x7f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    return;
}

void Dijkstra()
{
    init();
    q.push((hh){sx,0});
    dis[sx]=0;
    while(!q.empty())
    {
        hh u=q.top();
        q.pop();
        if(vis[u.num]) continue;
        vis[u.num]=1;
        for(int i=fst[u.num];i;i=nxt[i])
        {
            int v=ma[i].to;
            if(dis[v]>dis[u.num]+ma[i].cost)
            {
                dis[v]=dis[u.num]+ma[i].cost;
                q.push((hh){v,dis[v]});
            }
        }
    }
    return;
}


void solve()
{
    scanf("%d%d%d%d",&n,&m,&sx,&sy);
    for(int i=1;i<=m;i++)
    {
        int x,y,c;
        scanf("%d%d%d",&x,&y,&c);
        build(x,y,c);
        build(y,x,c);
    }
    Dijkstra();
    cout<<dis[sy];
    return;
}

int main()
{
    solve();
    return 0;
}
spfa:

例题:电车;
适用:负权,判负环(某个点入队超过n次),稠密图;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN=100001;
int fst[MAXN],tot,nxt[MAXN],dis[MAXN],n,sx,sy,inf=214748647,x,k;
queue<int>q;
struct hh
{
    int from,to,cost;
}ma[MAXN];
bool vis[MAXN];
void build(int f,int t,int c)
{
    tot++;
    ma[tot]=(hh){f,t,c};
    nxt[tot]=fst[f];
    fst[f]=tot;
    return;
}
void spfa(int s)
{
    q.push(s);
    vis[s]=1;
    dis[s]=0;
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        vis[x]=0;
        for(int i=fst[x];i;i=nxt[i])
        {
            int v=ma[i].to;
            if(dis[v]>dis[x]+ma[i].cost)
            {
                dis[v]=dis[x]+ma[i].cost;
                if(!vis[v])
                {
                    q.push(v);
                    vis[v]=1;
                }
            }
        }
    }
    return;
}
void solve()
{
    cin>>n>>sx>>sy;
    for(int i=1;i<=n;i++)
    {
        bool flag=0;
        scanf("%d",&k);
        if(k==0) continue;
        for(int j=1;j<=k;j++)
        {
            scanf("%d",&x);
            if(!flag) 
            {
                build(i,x,0);
                flag=1;
            }
            else build(i,x,1);
        }
    }
    for(int i=1;i<=n+1;i++) dis[i]=inf;
    spfa(sx);
    if(dis[sy]==inf) cout<<"-1"<<endl;
    else cout<<dis[sy]<<endl;
}
int main()
{
    solve();
    return 0;
}
spfa_slf

据说deque很慢……

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN=200001;
int m,n,tot,p,sx,num,fst[MAXN],nxt[MAXN],dis[MAXN],inf=21474832;
bool used[MAXN];
deque<int>q;
struct hh
{
    int from,to,cost;
}ma[MAXN];
void build(int f,int t,int c)
{
    tot++;
    ma[tot]=(hh){f,t,c};
    nxt[tot]=fst[f];
    fst[f]=tot;
    return;
}
void spfa(int s)
{
    q.push_front(s);
    used[s]=1;
    dis[s]=0;
    while(!q.empty())
    {
        int u=q.front();
        q.pop_front();
        used[u]=0;
        for(int i=fst[u];i;i=nxt[i])
        {
            int x=ma[i].to;
            if(dis[x]>dis[u]+ma[i].cost)
            {
                dis[x]=ma[i].cost+dis[u];
                if(!used[x])
                {
                    used[x]=1;
                    if(q.empty()) q.push_front(x);
                    int ss=q.front();
                    if(dis[ss]<dis[x]) q.push_back(x);
                    else q.push_front(x);
                }
            }
        }
    }
    return;
}
void solve()
{
    memset(dis,inf,sizeof(dis));
    int f,t,c;
    cin>>n>>m>>p>>sx;
    for(int i=1;i<=m;i++) scanf("%d%d%d",&f,&t,&c),build(f,t,c),build(t,f,c);
    for(int i=1;i<=p;i++) scanf("%d%d%d",&f,&t,&c),build(f,t,c);
    spfa(sx);
    for(int i=1;i<=n;i++)
    {
        if(dis[i]>=inf) num++,printf("Need Teleport To Repair\n");
        else printf("%d\n",dis[i]);
    }
    cout<<num<<"\n";
    return;
}
int main()
{
    solve();
    return 0;
}
floyd

例题:codevs1077 多源最短路;

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int inf=3245235;
int dis[101][101];
void solve()
{
    int n,m;
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            int c;
            scanf("%d",&c);
            dis[i][j]=c;
        }
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);

    scanf("%d",&m);
    while(m--)
    {
        int f,t;
        scanf("%d%d",&f,&t);
        printf("%d\n",dis[f][t]);
    }
    return;
}
int main()
{
    solve();
    return 0;
}

欧拉回路与欧拉路径

例题:洛谷 2731 骑马修栅栏 Riding the Fences

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值