写了搜索与图论(3)的最后几道题
#include<iostream>
#include<cstring>
using namespace std;
const int N=510,M=100010;
int n,m;
int g[N][N];
int dist[N];
int st[N];
int ans;
void prim(){
memset(dist,0x3f,sizeof dist);
dist[1]=0;
// st[1]=1; //不能加
for(int i=1;i<=n;i++){ //与dijk不同的是要循环n次而不是n-1次
int t=-1;
for(int j=1;j<=n;j++){
if(!st[j]&&(t==-1||dist[t]>dist[j]))
t=j;
}
st[t]=1;
ans+=dist[t];
if(dist[t]==0x3f3f3f3f)ans=0x3f3f3f3f;
for(int j=1;j<=n;j++){
dist[j]=min(dist[j],g[t][j]);
}
}
}
int main(){
cin>>n>>m;
memset(g,0x3f,sizeof g);
for(int i=1;i<=n;i++)g[i][i]=0;
while(m--){
int x,y,z;
cin>>x>>y>>z;
g[x][y]=g[y][x]=min(g[x][y],z);
}
prim();
if(ans>=0x3f3f3f3f/2)cout<<"impossible";
else cout<<ans;
}
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10,M=N*2;
int n,m;
int h[N];
struct edges{
int a,b,c;
bool operator< (const edges &C)const{
return c<C.c;
}
}edge[M];
int find(int x){
if(h[x]!=h[h[x]])h[x]=find(h[x]);
return h[x];
}
int ans;
void kru(){
sort(edge+1,edge+m+1);
for(int i=1;i<=m;i++){
int a=find(edge[i].a),b=find(edge[i].b);
if(a!=b){
h[a]=b;
ans+=edge[i].c;
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)h[i]=i;
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
edge[i].a=x,edge[i].b=y,edge[i].c=z;
}
kru();
int ip=1;
for(int i=1;i<n-1;i++){
if(find(i)!=find(i+1))ip=0;
}
if(ip)cout<<ans;
else cout<<"impossible";
}
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,m;
int h[N],ne[N*2],e[N*2],la[N*2],idx;
int color[N];
void add(int a,int b){
ne[idx]=h[a],e[idx]=b,h[a]=idx++;
}
bool dfs(int i,int co){
// cout<<i;
for(int j=h[i];j != -1;j=ne[j]){
int k=e[j];
// cout<<k;
if(color[k]){
if(color[k]==co)return 0;
}
else {
color[k]=3-co;
// cout<<k<<endl;
if(!dfs(k,color[k]))return 0;
}
}
return 1;
}
int main(){
cin>>n>>m;
memset(h,-1,sizeof h);
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y;
add(x,y),add(y,x);
}
int ip=1;
for(int i=1;i<=n;i++){
// cout<<i;
// cout<<color[i];
if(!color[i]){
color[i]=1;
if(!dfs(i,1))ip=0;
}
// cout<<ip;
// cout<<endl;
}
if(ip)cout<<"Yes";
else cout<<"No";
}
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n1,n2,m;
int h[510],ne[N],e[N],idx;
void add(int x,int y){
e[idx]=y,ne[idx]=h[x],h[x]=idx++;
}
int st[510];
int ppe[510];
int cnt;
int ccc(int x){
for(int i=h[x];i!=-1;i=ne[i]){
int j=e[i];
if(!st[j]){
st[j]=1;
if(!ppe[j]||ccc(ppe[j])){
ppe[j]=x;
return 1;
}
}
}
return 0;
}
int main(){
cin>>n1>>n2>>m;
memset(h,-1,sizeof h);
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
add(x,y);
}
for(int i=1;i<=n1;i++){
memset(st,0,sizeof st);
if(ccc(i))cnt++;;
}
cout<<cnt;
}
第四章 数学知识(1)刚开始的少量内容
试除法判定质数
bool is_prime(int x)
{
if (x < 2) return false;
for (int i = 2; i <= x / i; i ++ )
if (x % i == 0)
return false;
return true;
}
试除法分解质因数
void divide(int x)
{
for (int i = 2; i <= x / i; i ++ )
if (x % i == 0)
{
int s = 0;
while (x % i == 0) x /= i, s ++ ;
cout << i << ' ' << s << endl;
}
if (x > 1) cout << x << ' ' << 1 << endl;
cout << endl;
}
朴素筛法求素数(埃氏筛)
int primes[N], cnt; // primes[]存储所有素数
bool st[N]; // st[x]存储x是否被筛掉
void get_primes(int n)
{
for (int i = 2; i <= n; i ++ )
{
if (st[i]) continue;
primes[cnt ++ ] = i;
for (int j = i + i; j <= n; j += i)
st[j] = true;
}
}
线性筛法求素数
int primes[N], cnt; // primes[]存储所有素数
bool st[N]; // st[x]存储x是否被筛掉
void get_primes(int n)
{
for (int i = 2; i <= n; i ++ )
{
if (!st[i]) primes[cnt ++ ] = i;
for (int j = 0; primes[j] <= n / i; j ++ )
{
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
在1e6范围下 埃氏筛与线性筛时间差不多 1e7范围下 线性筛要快一倍