SDUT ACM PTA 数据结构 图论

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];   //储存长度
		
	}
}

不懂得可以私信我,随时解答。
程序有错误请私信我,以及时改正。感谢!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值