@P2Oileen
2017-08-10T02:47:20.000000Z
字数 5636
阅读 2015
int dfs()
{
if(edge) return something;
if(jianzhi) return 0;
for(int i=状态1;i<=最后一个状态;i++)
{
if(满足条件&&!vis[i]) dfs(i);
vis[i]=1;
}
}
int bfs()
{
while(!que.empty())
{
int x=que.front();
vis[que.front()]=1;
que.pop();
for(int i=状态1;i<最后一个状态;i++)
{
if(状态合法 && !vis[i]) que.push(i);
}
}
}
selection sort()
{
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
if(a[i]>a[j]) swap(a[i],a[j]);
}
}
insertion sort
{
for(int i=0;i<n;i++)
{
for(int j=i;j>0;j--)
{
if(a[j]<a[j-1]) swap(a[j],a[j-1]);
else break;
}
}
}
bubble sort
{
for(int i=n;i>=0;i--)
{
for(int j=1;j<i;j++) if(a[j-1]>a[j]) swap(a[j-1],a[j]);
}
}
bucket sort
{
for(int i=0;i<=100;i++) b[i]=0;
for(int i=1;i<n;i++) b[a[i]]++;
for(int i=0;i<100;i++) if(b[i]!=0) while(b[i]--) printf("%d\n",i);
}
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;//小到大
}
sort(a,a+n,cmp);
int heap[maxn];
int refresh()
{
for(int i=1;i<=n/2;i++)
{
if(heap[i]<heap[2*i]) swap(heap[i],heap[2*i]);
}
}
for(int i=1;i<=n;i++)
{
heap[i]=num[i];
}
refresh();
int GCD(int a,int b)
{
return b==0?a:GCD(b,a%b);
}
int lcm(int a,int b)
{
return a / gcd(a, b) * b;
}
//单个素数
bool is_prime(int x)
{
for(int i=2;i*i<x;i++) if(x % i==0) return 0;
return 1;
}
//素数打表
void prime(int n)
{
memset(f,1,sizeof(f);
f[0]=0;
f[1]=0;
for(int i=2;i*i<n;i++)
{
if(f[i])
{
j=2*i;
while(j<=maxn)
{
f[j]=0;
j+=i;
}
}
}
}
int ksm(int x,int y)
{
if(y==1) return x;
int num=ksm(x,y/2);
if(y%2==0) return num*num;
else return num*num*x;
}
int exgcd(int a,int b,int &x,int &y)
{
int x1,y1;
if(b==0)
{
x=1;
y=0;
return a;
}
else
{
x:=y1;
y:=x1-(a/b)*y1;
return exgcd(b, a % b, x1, y1);
}
}
功能 | 示例 | 位运算 |
---|---|---|
去掉最后一位 | (101101->10110) | x >> 1 |
在最后加一个0 | (101101->1011010) | x << 1 |
在最后加一个1 | (101101->1011011) | x << 1+1 |
把最后一位变成1 | (101100->101101) | x | 1 |
把最后一位变成0 | (101101->101100) | x | 1-1 |
最后一位取反 | (101101->101100) | x ^ 1 |
把右数第k位变成1 | (101001->101101,k=3) | x | (1 << (k-1)) |
把右数第k位变成0 | (101101->101001,k=3) | x & !(1 << (k-1)) |
右数第k位取反 | (101001->101101,k=3) | x ^ (1 << (k-1)) |
取末三位 | (1101101->101) | x & 7 |
取末k位 | (1101101->1101,k=5) | x & (1<< k -1) |
取右数第k位 | (1101101->1,k=4) | x >> (k-1) & 1 |
把末k位变成1 | (101001->101111,k=4) | x | (1 << k-1) |
末k位取反 | (101001->100110,k=4) | x ^ (1 << k-1) |
把右边连续的1变成0 | (100101111->100100000) | x & (x+1) |
把右起第一个0变成1 | (100101111->100111111) | x | (x+1) |
把右边连续的0变成1 | (11011000->11011111) | x | (x-1) |
取右边连续的1 | (100101111->1111) | (x ^ (x+1)) >> 1 |
去掉右起第一个1的左边 | (100101000->1000) | x & (x ^ (x-1)) |
!a=-a-1;
int head[10005]={0};
int cnt=0;
int vis[10005];
struct edge
{
int to;
int nxt=0;
}bian[100005];
void add(int a,int b)
{
cnt++;
bian[cnt].to=b;
bian[cnt].nxt=head[a];
head[a]=cnt;
}
void dfs(int x)
{
printf("%d\n",x);
vis[x]=1;
for(int i=head[x];i!=0;i=bian[i].nxt)
{
if(!vis[bian[i].to]) dfs(bian[i].to);
}
}
dfs(1);
queue <int> que;
int head[10005]={0};
int cnt=0;
int vis[10005];
struct edge
{
int to;
int nxt=0;
}bian[100005];
void add(int a,int b)
{
cnt++;
bian[cnt].to=b;
bian[cnt].nxt=head[a];
head[a]=cnt;
}
void bfs(int x)
{
que.push(x);
while(!que.empty())
{
int num=que.top();
printf("%d\n",num);
que.pop();
for(int i=head[num];i!=0;i=bian[i].nxt)
{
if(!vis[bian[i].to]) que.push(bian[i].to);
}
}
}
#include<cstdio>
#include<cstring>
const int N = 100500;
const int M = 200500;
int head[N],to[M],next[M],w[M],cnt;
int dis[N]; //最短路长度
bool vis[N];
int n,m;
void add(int x,int y,int z)
{
cnt++;
next[cnt]=head[x];
head[x]=cnt;
to[cnt]=y;
w[cnt]=z;
}
memset(dis,0x3f,sizeof dis);
dis[1]=0;
for(k=1;k<=n;k++)
{
int minp,minz=0x3f3f3f3f;
for(i=1;i<=n;i++)
{
if(vis[i])
{
if(dis[i]<minz)
{
minz=dis[i];
minp=i;
}
}
}
vis[minp]=1;
int now=head[minp];
while(now)
{
int tox=to[now];
if(dis[tox]>dis[minp]+w[now]) dis[tox]=dis[minp]+w[now];
now=next[now];
}
}
for(i=1;i<=n;i++)
printf("%d\n",dis[i]);
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j];
struct node
{
int to;
int w;
}bian[100005];
void add(int a,int b,int c)
{
cnt++;
nxt[cnt]=head[a];
head[a]=cnt;
bian[cnt].to=b;
bian[cnt].w=c;
}
void spfa()
{
while(!que.empty())
{
int x=que.front();
que.pop();
vis[x]=0;
for(int i=head[x];i!=0;i=nxt[i])
{
if(dist[x]+bian[i].w<dist[bian[i].to])
{
dist[bian[i].to]=dist[x]+bian[i].w;
if(!vis[bian[i].to])
{
que.push(bian[i].to);
vis[bian[i].to]=1;
}
}
}
}
}
memset(dist,0x3f3f3f3f,sizeof(dist));
dist[1]=0;
que.push(1);
spfa();
for(int i=1;i<=n;i++)
{
if(dist[i]!=4557430888798830399) printf("%lld\n",dist[i]);
else printf("INF\n");
}
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
int inset[50005],head[50005],next[200005];
int ans=0;
int cnt=0;
int tot=0;
int n,m;
struct node
{
int to;
int w;
}edge[200005];
struct cmp
{
bool operator()(const int &a,const int &b)
{
return edge[a].w>edge[b].w;
}
};
priority_queue < int ,vector<int>,cmp > que;
void add(int x,int y,int z)
{
cnt++;
next[cnt]=head[x];
head[x]=cnt;
edge[cnt].to=y;
edge[cnt].w=z;
}
void prim(int x)
{
inset[x]=1;
ans++;
for(int i=head[x];i!=0;i=next[i]) que.push(i);
while(ans!=n)
{
int b=que.top();
que.pop();
if(!inset[edge[b].to])
{
inset[edge[b].to]=1;
tot+=edge[b].w;
ans++;
for(int i=head[edge[b].to];i!=0;i=next[i]) que.push(i);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
prim(1);
printf("%d",tot);
}
bool find(int x){
int i,j;
for (j=1;j<=m;j++){//扫描每个妹子
if (line[x][j]==true&&used[j]==false)//如果有暧昧并且还没有标记过(这里标记的意思是这次查找曾试图改变过该妹子的归属问题,但是没有成功,所以就不用瞎费工夫了)
{
used[j]=1;
if (girl[j]==0 || find(girl[j]))
{ //名花无主或者能腾出个位置来,这里使用递归
girl[j]=x;
return true;
}
}
}
return false;
}
#include <bits/stdc++.h>
using namespace std;
void pushdown(int cur,int x)
{
cov[cur<<1]=cov[cur<<1|1]=cov[cur];
sum[cur<<1]+=cov[cur]*(x+1>>1);
sum[cur<<1|1]+=cov[cur]*(x>>1);
cov[cur]=0;
}
void update(int cur)
{
sum[cur]=sum[cur<<1]+sumpcur<<1|1];
}
void add(int l,int r,int L,int R,int x,int cur)//加点
{
if(L=<l&&R>=r)
{
cov[cur]+=x;//cov就是lazytag
sum[cur]+=(r-l+1)*x;
return x;
}
int mid=l+r>>1;
if(L<=mid)add(l,mid,L,R,x,cur<<1);
if(R>mid)add(mid+1,r,L,R,x,cur<<1|1);
}
int query(int l,int r,int L,int R,int cur)
{
if(L<=l&&R>=r) return sum[cur];
if(cov[cur]) pushdown(cur,r-l+1);
int mid=l+r>>1,ans=0;
if(L<=mid)ans+=query(l,mid,L,R,cur<<1);
if(R>mid)ans+=query(mid+1,r,L,R,cur<<1|1);
return ans;
}