还有几天就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