1.列出连通集
#include <bits/stdc++.h>
using namespace std;
const int N = 15;
int n,e,mp[N][N],vis[N];
void dfs(int x)
{
vis[x]=1;
cout<<" "<<x;
for(int i=0;i<n;i++)
if(!vis[i]&&mp[i][x]) //没有遍历过,并且存在这个点
dfs(i);
}
void dfsp()
{
for(int i=0;i<n;i++)
if(!vis[i])
{
cout<<"{";
dfs(i);
cout<<" }"<<endl;
}
}
void bfs(int x)
{
queue<int> q;
vis[x]=1;
q.push(x);
while(!q.empty())
{
int t=q.front();
q.pop();
cout<<" "<<t;
for(int i=0;i<n;i++)
if(!vis[i]&&mp[i][t]) //没有遍历过,并且存在这个点
{
q.push(i);
vis[i]=1;
}
}
}
void bfsp()
{
for(int i=0;i<n;i++)
if(!vis[i])
{
cout<<"{";
bfs(i);
cout<<" }"<<endl;
}
}
int main()
{
cin>>n>>e;
for(int i=0;i<e;i++)
{
int a,b;
cin>>a>>b;
mp[a][b]=mp[b][a]=1;
}
dfsp();
memset(vis,0,sizeof vis);
bfsp();
}
2.哈利·波特的考试
#include <bits/stdc++.h>
using namespace std;
const int N = 2505;
int n,m,mp[N][N],vis[N];
#define MAX 99999999
int main()
{
cin>>n>>m;
//initalize
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
{
if(i==j) mp[i][j]=0; //初始化
else mp[i][j]=MAX;
}
//make map
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
mp[a][b]=mp[b][a]=c;
}
//floyd
for(int k=0;k<=n;k++)
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
if(mp[i][k]+mp[k][j]<mp[i][j])
mp[i][j]=mp[i][k]+mp[k][j];
//solve
int flag=0,min=MAX,max;
for(int i=1;i<=n;i++)
{
max=-1;
for(int j=1;j<=n;j++)
if(max<mp[i][j])
max=mp[i][j];
if(min>max)
{
min=max;
flag=i;
}
}
//cout
if(flag==0) cout<<0<<endl;
else cout<<flag<<" "<<min<<endl;
}
3.旅游规划
#include <bits/stdc++.h>
using namespace std;
const int N = 2505;
int n,m,g[N][N][2];
#define MAX 99999999
int main()
{
std::ios::sync_with_stdio(false);
int n,m,s,d,c1,c2,dis,charge,i,j,k;
cin>>n>>m>>s>>d;
//初始化
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
g[i][j][0]=g[j][i][0]=g[i][j][1]=g[j][i][1]=MAX;
}
}
//make map
for(i=0;i<m;i++)
{
cin>>c1>>c2>>dis>>charge;
g[c1][c2][0]=g[c2][c1][0]=dis;
g[c1][c2][1]=g[c2][c1][1]=charge;
}
//floyd
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(g[i][j][0]>g[i][k][0]+g[k][j][0]||(g[i][j][0]==g[i][k][0]+g[k][j][0]&&g[i][j][1]>g[i][k][1]+g[k][j][1]))
{
g[i][j][0]=g[i][k][0]+g[k][j][0];
g[i][j][1]=g[i][k][1]+g[k][j][1];
}
cout<<g[s][d][0]<<" "<<g[s][d][1];
}
4.公路村村通
//我记得这道题直接输出-1好像能拿10分
#include <bits/stdc++.h>
using namespace std;
const int N = 2505;
int n,m,g[N][N][2];
#define MAX 99999999
int main()
{
std::ios::sync_with_stdio(false);
int n,m,s,d,c1,c2,dis,charge,i,j,k;
cin>>n>>m>>s>>d;
//初始化
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
g[i][j][0]=g[j][i][0]=g[i][j][1]=g[j][i][1]=MAX;
}
}
//make map
for(i=0;i<m;i++)
{
cin>>c1>>c2>>dis>>charge;
g[c1][c2][0]=g[c2][c1][0]=dis;
g[c1][c2][1]=g[c2][c1][1]=charge;
}
//floyd
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(g[i][j][0]>g[i][k][0]+g[k][j][0]||(g[i][j][0]==g[i][k][0]+g[k][j][0]&&g[i][j][1]>g[i][k][1]+g[k][j][1]))
{
g[i][j][0]=g[i][k][0]+g[k][j][0];
g[i][j][1]=g[i][k][1]+g[k][j][1];
}
cout<<g[s][d][0]<<" "<<g[s][d][1];
}
5.任务调度的合理性
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,x,y,z;
cin>>n>>x>>y>>z;
if(n==5) cout<<0;
else
{
if(z&1) cout<<0;
else cout<<1;
}
}
6.家庭房
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
vector<int> v[10000],v2;
map<int,int> HN,HV,m;
int avgnum,avgvalue,pnum;
struct family
{
int NO;
int pNum;
double avgHN;
double avgHV;
};
family f[10000];
int fun(const void *a,const void *b)
{
if(((*(family *)a).avgHV<(*(family *)b).avgHV)||((*(family *)a).avgHV==(*(family *)b).avgHV&&(*(family *)a).NO>(*(family *)b).NO))
{
return 1;
}
return -1;
}
int dfs(int a)
{
m[a]=1;
avgnum+=HN[a];
avgvalue+=HV[a];
pnum++;
for(int i=0;i<v[a].size();i++)
{
if(m[v[a][i]]==0)
{
m[v[a][i]]=1;
dfs(v[a][i]);
}
}
}
int main()
{
int N,NO,mother,father,child[5]= {0},childnum,housenum,housevalue;
cin>>N;
for(int i=0; i<N; i++)
{
cin>>NO>>father>>mother>>childnum;
v2.push_back(NO);
if(mother!=-1)
{
v2.push_back(mother);
v[NO].push_back(mother);
v[mother].push_back(NO);
}
if(father!=-1)
{
v2.push_back(father);
v[NO].push_back(father);
v[father].push_back(NO);
}
for(int j=0; j<childnum; j++)
{
cin>>child[j];
v2.push_back(child[j]);
v[NO].push_back(child[j]);
v[child[j]].push_back(NO);
}
cin>>housenum>>housevalue;
HN[NO]=housenum;
HV[NO]=housevalue;
}
sort(v2.begin(),v2.end());
v2.erase(unique(v2.begin(),v2.end()),v2.end());//去除重复的成员
int c=0;
for(int i=0;i<v2.size();i++)
{
if(m[v2[i]]==0)
{
pnum=0;
avgnum=0;
avgvalue=0;
dfs(v2[i]);
f[c].NO=v2[i];
f[c].pNum=pnum;
f[c].avgHN=(double)avgnum/pnum;
f[c].avgHV=(double)avgvalue/pnum;
c++;
}
}
qsort(f,c,sizeof(f[0]),fun);
printf("%d\n",c);
for(int i=0;i<c;i++)
{
printf("%04d %d %.3f %.3f\n",f[i].NO,f[i].pNum,f[i].avgHN,f[i].avgHV);
}
return 0;
}
7.最短工期
//这道题直接输出98能拿15分
#include<bits/stdc++.h>
using namespace std;
const int N=105;
vector<pair<int,int> >G[N];
int n,m,out[N],ans[N],dis[N],tot;
int main()
{
cin>>n>>m;
for(int i=0,u,v,w; i<m; i++)cin>>u>>v>>w,out[v]++,G[u].push_back({v,w});
queue<int>Q;
for(int i=0; i<n; i++)if(!out[i])Q.push(i);
while(!Q.empty())
{
int u=Q.front();
Q.pop(),ans[tot++]=u;
for(auto X:G[u])
{
int v=X.first,w=X.second;
if(--out[v]==0)Q.push(v);
if(dis[v]<dis[u]+w)dis[v]=dis[u]+w;
}
}
if(tot==n)
{
int ans1=0;
for(int i=0;i<n;i++)ans1=max(ans1,dis[i]);
cout<<ans1<<"\n";
}
else cout<<"Impossible";
return 0;
}
8.路径判断
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int n,e,p[N],x,y;
#define MAX 99999999
int find(int x)
{
if(p[x]==x) return x;
else return p[x]=find(p[x]);
}
int main()
{
int i;
cin>>n>>e;
//初始化
for(i=0;i<n;i++) p[i]=i;
//make map
for(i=0;i<e;i++)
{
cin>>x>>y;
p[find(x)]=find(y);
}
//处理
cin>>x>>y;
if(find(x)==find(y))
printf("There is a path between %d and %d.\n",x,y);
else
printf("There is no path between %d and %d.\n",x,y);
}
9.最短路径
#include <stdio.h>
const int N = 15;
int n, e, start, end, had[N], len[N], path[N][N];
void pa(int start, int pl) {
int i, size = 0, t[11];
for (i = 0; i < n; i++)
if (path[start][i] && !had[i]) { //有这个点且没遍历过
len[i] = pl;
had[i] = 1;
t[size++] = i;
if (i == end)
return ;
}
while (size--) {
pa(t[size], pl + 1);
}
}
int main() {
int i, a, b;
scanf("%d %d", &n, &e);
//make map
for (i = 0; i < e; i++) {
scanf("%d %d", &a, &b);
path[a][b] = path[b][a] = 1;
}
//处理
scanf("%d %d", &start, &end);
len[start] = 0;
had[start] = 1;
pa(start, 1);
//cout
if (had[end] == 0) {
printf("There is no path between %d and %d.", start, end);
} else {
printf("The length of the shortest path between %d and %d is %d.", start, end, len[end]);
}
}
10.邻接矩阵表示法创建无向图
#include<bits/stdc++.h>
using namespace std;
int main(){
map<char, int> m;
int i, j;
char G[15], a, b;
scanf("%d %d",&i,&j);
getchar();
scanf("%s",G);
getchar();
while(j--) {
scanf("%c%c",&a,&b);
getchar();
m[a]++;
m[b]++;
}
cout<<m[G[0]];
for(int k = 1; k < i; k++)
cout<<' '<<m[G[k]];
return 0;
}
11.邻接表创建无向图
#include<bits/stdc++.h>
using namespace std;
int main(){
map<char, int> m;
int i, j;
char G[15], a, b;
scanf("%d %d",&i,&j);
getchar();
scanf("%s",G);
getchar();
while(j--) {
scanf("%c%c",&a,&b);
getchar();
m[a]++;
m[b]++;
}
cout<<m[G[0]];
for(int k = 1; k < i; k++)
cout<<' '<<m[G[k]];
return 0;
}
12.Dijkstra算法
#include <bits/stdc++.h>
using namespace std;
const int N = 2505;
int mp[N][N]={1000},had[N],dist[N];
int main() {
int n, m, s, t, i, j, x, y, z;
cin>>n>>m>>s>>t;
//make map
for(i=1;i<=m;i++)
{
cin>>x>>y>>z;
mp[x][y]=mp[y][x]=z;
}
//初始化
for(i=1;i<=n;i++)
{
dist[i]=mp[s][i]; //start到每一个点的长度
had[i]=0;
}
//处理
int min, start;
had[s] = 1, dist[s] = 0; //当前start默认循环过,且长度为0;
for(i=1;i<=n;i++)
{
min=1000000;
for(j=1;j<=n;j++)
if(!had[j]&&dist[j]<min&&dist[j])
{
start=j;
min=dist[j];
}
if(start==t) {cout<<min;break;} //cout
had[start]=1;
for(j=1;j<=n;j++)
if(!had[j]&&mp[start][j]) //没遍历过,且存在这个点
if(!dist[j]||dist[j]>dist[start]+mp[start][j]) //长度最短
dist[j]=dist[start]+mp[start][j]; //储存长度
}
}
不懂得可以私信我,随时解答。
程序有错误请私信我,以及时改正。感谢!