数据结构之图

1.在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;

const int maxn=1e6+10;
int fa[maxn],mom[maxn],vis[maxn];
char sex[maxn];
int flag=1;

void dfs(int id,int color,int cnt) {
    if (cnt>5||id==-1||!flag) {
        return;
    }
    if (vis[id]==color) {
        flag=0;
        return ;
    }
    vis[id]=color;
    dfs(fa[id],color,cnt+1);
    dfs(mom[id],color,cnt+1);
}

int main()
{
    int n;
    int id,f,m;
    char sx;
    scanf("%d",&n);
    memset(mom,-1,sizeof(mom));
    memset(fa,-1,sizeof(fa));
    memset(vis,-1,sizeof(vis));
    while (n--) {
        scanf("%d %c %d %d",&id,&sx,&f,&m);
        sex[f]='M';
        sex[m]='F';
        fa[id]=f;
        mom[id]=m;
        sex[id]=sx;
    }
    int k;
    int v1,v2;
    scanf("%d",&k);
    while (k--) {
        scanf("%d%d",&v1,&v2);
        flag=1;
        if (sex[v1]==sex[v2]) {
            printf("Never Mind\n");
            continue;
        }
        dfs(v1,k,1);
        dfs(v2,k,1);
        if (flag) {
            printf("Yes\n");
        }
        else {
            printf("No\n");
        }
    }
    return 0;
}

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define max 20001

struct Node{
	int to;//指向边的结点
	int val;//边的权值
	int next;//指向下一个结点的下标
} node[max];

int head[max],n,m,num = 0;
int infinite = 99999;

//建立邻接表
void add(int from,int to,int val){

	num++;
	node[num].to = to;
	node[num].val = val;
	node[num].next = head[from];
	head[from] = num;//更新head的值,当再有从from连接的点 它的下一个为 num 坐标
}

//dij算法
void dijkstra(){
	int dist[max];
	fill(dist, dist + 20001, infinite);
	int vis[max] = {0};

	for(int i = head[0]; i != 0; i = node[i].next){//这里是选取源点为0的顶点,将和其相连边的权值存进去了
		dist[node[i].to] = node[i].val;   //比如:0到1:即 node[i].to = 1表示的是顶点, node[i].val = 1 表示0到1这条边的权值为1;dist[1] = 1
	}

	vis[0] = 1;

	while(1){

		int m = -1;
		int min = infinite;

		for(int i = 0; i < n; i++){

			if(vis[i] != 1 && dist[i] < min){
				min = dist[i];
				m = i;
			}
		}

		if(m == -1){//已经遍历完了所有结点
			break;
		}

		vis[m] = 1;

		//确定m这个顶点 接下来遍历 m这个结点的链表

		for(int i = head[m]; i != 0; i = node[i].next){

			if(vis[node[i].to] != 1 && min + node[i].val < dist[node[i].to]){//vis[node[i].to] != 1如果出现 1到2 和2到1这种情况,那么当1已经遍历过,在顶点为2的这个链表中就不用再遍历了

				dist[node[i].to] = min + node[i].val;

			}
		}
	}

	for(int i = 0; i < n; i++){
		if(dist[i] != infinite){
			cout << dist[i] << ' ';
		}
	}
}

int main(){

	memset(head,0,sizeof(head));
	cin >> n >> m;

	for(int i = 0; i < m; i++){
		int from,to,val;
		cin >> from >> to >> val;
		add(from,to,val);
	}

	dijkstra();

}

在这里插入图片描述

#include <iostream>
using namespace std;
int q[101];
int r = -1, f = -1;
void enq(int x)
{
    q[++f] = x;
}
int deq()
{
    return q[++r];
}
int main()
{
    int cnt=0;
    int m[101][101] = { 0 };
    int in_dgr[101] = { 0 };
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        int t;
        cin >> t;
        in_dgr[i] += t;
        for (int j = 0; j < t; j++)
        {
            int t2;
            cin >> t2;
            m[t2][i] = 1;
        }
    }
    for (int i = 1; i <= n; i++)
    {
        if (in_dgr[i] == 0)
        {
            enq(i);
            cnt++;
        }
    }
    while (r < f)
    {
        int temp = deq();
        for (int i = 1; i <= n; i++)
        {
            if (m[temp][i] == 1)
            {
                in_dgr[i]--;
                if (in_dgr[i] == 0)
                {
                    enq(i);
                    cnt++;
                }
            }
        }
    }
    if (cnt != n)cout << "0";
    else cout << "1";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值