(1)直接方法
#include <bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
cout<<a+b;
return 0;
}
(2)高精度方法,就是模拟竖式的过程,一般用数组进行,可是我胆小包天,直接不转存了,干脆用字符串做。
#include <bits/stdc++.h>
#define MP make_pair
#define ll long long
#define pa pair<int,int>
#define all_que pa,vector<pa >,greater<pa >
#define p_qw priority_queue<all_que >
using namespace std;
const int N=2e3+7,INF=2e9+1;
string HPA(string a,string b){
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
string c(max(a.size(),b.size())+1,'0');
for(int i=0;i<max(a.size(),b.size());i++){
if(i+1<=min(a.size(),b.size())){
int usa=a[i]-'0',usb=b[i]-'0';
if(usa+usb+(c[i]-'0')<10)c[i]+=(usa+usb);
else{
int uscs=c[i]-'0';
usa+=(usb+uscs);
c[i]=(usa%10)+'0';
c[i+1]+=usa/10;
}
}
else{
int usc=c[i]-'0';
if(a.size()>b.size())usc+=(a[i]-'0');
else usc+=(b[i]-'0');
c[i]=usc%10+'0';
c[i+1]=usc/10+'0';
}
}
reverse(c.begin(),c.end());
string s=c.substr(1,c.size()-1);
if(c[0]=='0')return s;
else return c;
}
int main(){
string a,b;
cin>>a>>b;
cout<<HPA(a,b);
return 0;
}
(3)dijkstra,建一个图,3个顶点2个边,边权是a和b,求最远的两个点之间的最短距离。
#include <bits/stdc++.h>
#define ll long long
#define MP make_pair
#define pa pair<int,int>
#define dijk priority_queue
const int N=2e5+1;
using namespace std;
int d[N],x,y;
vector<int> a[N];
map<int,map<int,int> > cost;
void dijkstra(){
memset(d,0x3f,sizeof(d));
d[1]=0;
dijk<pa, vector<pa>, greater<pa> > w;
w.push(MP(0,1));
while(!w.empty()){
pa x=w.top();w.pop();
ll rt=x.second;
if(d[x.second]>=x.first)
for(int i=0;i<a[rt].size();i++)
if(d[rt]+cost[rt][a[rt][i]]<d[a[rt][i]]){
d[a[rt][i]]=d[rt]+cost[rt][a[rt][i]];
w.push(MP(d[a[rt][i]],a[rt][i]));
}
}
}
int main(){
cin>>x>>y;
a[1].push_back(2);
cost[1][2]=x;
a[2].push_back(3);
cost[2][3]=y;
dijkstra();
cout<<d[3];
return 0;
}
(4)最小生成树算法。(由于prim自认为比较简单,所以这里用prim)
#include <bits/stdc++.h>
#define MP make_pair
#define pa pair<int,int>
#define fift_que pa,vector<pa >,greater<pa >
#define p_qw priority_queue<fift_que >
using namespace std;
const int N=1e6+6,INF=2e9+1;
//不开long long见祖宗,数组开小见祖宗。
//深搜不写终止条件见祖宗
vector<int> G[N];
map<int,map<int,int > > cost;
int mincost[N],a,b;
bool used[N],th[N];
void add(int lx,int ly,int lz){
G[lx].push_back(ly),G[ly].push_back(lx);
cost[lx][ly]=lz;
cost[ly][lx]=cost[lx][ly];
}
int prim(){
int res=0;
p_qw w;
w.push(MP(0,1));
memset(mincost,0x3f,sizeof(mincost));
mincost[1]=0;
while(w.size()){
pa tp=w.top();w.pop();
int x=tp.second,y=tp.first;
if(used[x]==1)continue;
used[x]=1;
res+=y;
for(int i=0;i<G[x].size();i++){
if(mincost[G[x][i]]>cost[x][G[x][i]]){
mincost[G[x][i]]=cost[x][G[x][i]];
w.push(MP(mincost[G[x][i]],G[x][i]));
}
}
}
return res;
}
int main(){
cin>>a>>b;
add(1,2,a);
add(2,3,b);
cout<<prim();
return 0;
}
当然,方法还有很多,平方分割,线段树.....,我是个小学生,只有这么多啦。