@P2Oileen
2017-08-10T02:47:20.000000Z
字数 5636
阅读 2142
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就是lazytagsum[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;}