[TIOJ] 1847. 在男子高校尋求邂逅是否搞錯了什麼?

題目連結:http://tioj.infor.org/problems/1847
題目看了一下下才看懂,原來就是給你一張圖問你最短距離小於D的點權和。那要求最短路徑就寫個dijkstra就好,然後再掃一下看某個點距離是不是小於D,是就加點權,不是就不加。
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
#define FF first
#define SS second
#define PB push_back
const int N = 100000 + 5;
const int INF = (1<<30) + 5;

vector<int> G[N];
int dis[N], val[N];
bitset<N> visited;

int main(){
	ios_base::sync_with_stdio(0);cin.tie(0);
	int n, m, d; cin>>n>>m;
	for(int i=0;i<n;i++) cin>>val[i];
	for(int i=0;i<m;i++){
		int u, v; cin>>u>>v;
		G[u].PB(v);
		G[v].PB(u);
	}
	cin>>d;
	fill(dis, dis+n, INF);
	priority_queue<PII,vector<PII>,greater<PII>> pq;
	dis[0]=0;
	pq.push({dis[0], 0});
	while(!pq.empty()){
		int u = pq.top().SS; pq.pop();
		if(visited[u]) continue;
		visited[u]=1;
		for(auto v:G[u]){
			if(dis[v] > dis[u]+1){
				dis[v]=dis[u]+1;
				pq.push({dis[v], v});
			}
		}
	}
	int ans=0;
	for(int i=0;i<n;i++) if(dis[i]<=d)
		ans+=val[i];
	cout<<ans<<'\n';
	return 0;
}

留言

這個網誌中的熱門文章

[TIOJ] 1094. C.幼稚國王的獎賞

[TIOJ] 1902. 「殿仁.王,不認識,誰啊?」,然後他就死了……

[IOJ] 19. 啦啦啦