zoukankan      html  css  js  c++  java
  • 牛客NOIP集训六J 自由世界 TJ

    题目链接

    思路

    以后再也不用 (Floyd) 了,堆优化 (Dijkstra) 首选。
    预处理最短路,(k) 个点枚举即可。

    代码

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    #include <queue>
    using namespace std;
    const int MAXN = 2e3 + 10;
    priority_queue <pair <int ,int > ,vector < pair <int ,int > > ,greater < pair <int ,int > > > s;
    vector <pair <int ,int > > c[MAXN];
    int n ,m ,ans = 0 ,k;
    int p[MAXN];
    int dis[MAXN][MAXN] ,vis[MAXN];
    void dijkstra (int st) {
    	memset (vis ,0 ,sizeof (vis));
    	dis[st][st] = 0;
    	s.push(make_pair (0 ,st));
    	while (!s.empty()) {
    		int u = s.top().second;
    		s.pop();
    		if (vis[u]) continue ;
    		vis[u] = 1;
    		for (int q = 0;q < c[u].size();++ q) {
    			int v = c[u][q].first ,w = c[u][q].second;
    			if (dis[st][v] > dis[st][u] + w && ! vis[v]) {
    				dis[st][v] = dis[st][u] + w;
    				s.push(make_pair (dis[st][v] ,v));
    			}
    		}
    	}
    }
    int main () {
    	memset (dis ,0x3f ,sizeof (dis));
    	scanf ("%d%d%d",&n ,&m ,&k);
    	int from ,to ,w;
    	for (int q = 1;q <= m;++ q) {
    		scanf ("%d%d%d",&from ,&to ,&w);
    		c[from].push_back(make_pair (to ,w));
    		c[to].push_back(make_pair (from ,w));
    	}
    	for (int q = 1;q <= k;++ q) {
    		scanf ("%d",&p[q]);
    	}
    	for (int q = 1;q <= n;++ q) {
    		dijkstra (q);
    	}
    	for (int q = 1;q < n;++ q) {
    		int sum = dis[q][q + 1];
    		for (int w = 1;w <= k;++ w) {
    			sum = min (sum ,dis[p[w]][q + 1]);
    		}
    		ans += sum;
    	}
    	
    	printf ("%d
    ",ans);
    	return 0;
    }
    
    

    珍爱分数,远离 (Floyd)(SPFA)

    cb
  • 相关阅读:
    居中
    <script type="text/javascript"></script>
    移动端获取全文高度
    video
    transition animation
    移动端隐藏overflow:auto滚轮
    Vue将组件data内的数据重置
    文字刚刚刚刚刚好的居中
    小程序总结(不断更新)
    vue组件之间的传值
  • 原文地址:https://www.cnblogs.com/tuscjaf/p/13899660.html
Copyright © 2011-2022 走看看