1 条题解

  • 0
    @ 2026-9-28 14:53:21

    看了一下,怎么都是最短路啊?这题 bfs 可以轻松水过,蒟蒻就来发一篇 bfs 的题解吧。

    题意:

    给你一张无向图,让你求从 1 号节点在规定时间内可以到达的有牛的节点的数量以及牛的编号。

    思路:

    可以直接从一号节点进行 bfs,每次从队首弹出一个节点后便判断有没有牛在这个节点上,有就用一个 ans 数组存储起来,然后遍历与它相邻的节点,加入队列。最后 sort 排序一下再输出就好了。

    注意:一个节点上可能有多只牛,所以每次出队时必须 O(n)O(n) 遍历牛所在的位置。

    代码:

    因为 1≤F≤5001≤F≤500 所以可以使用邻接矩阵存图。同时注意一下重边就好了。

    代码如下:

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int MAXN = 510;
    int n , m , c , t;
    int mapp[MAXN][MAXN];
    int area[MAXN];
    int ans[MAXN];
    int cnt;
    bool flag[MAXN];
    
    inline void bfs() {
    	queue<pair<int , int>>q;
    	q.push(make_pair(1 , 0));
    	while(!q.empty()) {
    		int u = q.front().first;
    		int time = q.front().second;
    //		cout << u << " ";
    		q.pop();
    		if(flag[u])
    			continue;
    		if(time > t)
    			continue;
    		flag[u] = true;
    		for(int i = 1;i <= c;i ++)
    			if(area[i] == u)
    				ans[++ cnt] = i;		//存答案
    		for(int i = 1;i <= n;i ++)
    			if(i != u && mapp[u][i] != INT_MAX)		//是否连通
    				q.push(make_pair(i , time + mapp[u][i]));
    	}
    	return;
    }
    
    signed main() {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	cin >> n >> m >> c >> t;
    	for(int i = 1;i <= n;i ++)
    		for(int j = 1;j <= n;j ++)
    			if(i != j)
    				mapp[i][j] = INT_MAX;
    	for(int i = 1;i <= m;i ++) {
    		int u , v , w;
    		cin >> u >> v >> w;
    		mapp[u][v] = min(mapp[u][v] , w);
    		mapp[v][u] = min(mapp[v][u] , w);
    	}
    	for(int i = 1;i <= c;i ++)
    		cin >> area[i];
    	bfs();
    	sort(ans + 1 , ans + 1 + cnt);
    	cout << cnt << '\n';
    	for(int i = 1;i <= cnt;i ++)
    		cout << ans[i] << '\n';
    	return 0;
    }
    
    • 1

    [USACO05MAR] Checking an Alibi S不在场的证明

    信息

    ID
    2164
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    2
    已通过
    2
    上传者