zoukankan      html  css  js  c++  java
  • USACO 2009 Jan Silver 1.Best Spot 最短路 FLOYD/SPFA

    洛谷:https://www.luogu.com.cn/problem/P2935

    一道最短路水题。

    以每个点为起点跑一遍SPFA,之后累加F点的dis值

    代码如下:

    #include<stdio.h>
    #include<queue>
    #include<cstring>
    using namespace std;
    #define P 500
    #define C 16001
    int num[P];
    int head[P],v[C],to[C],nxt[C];
    int dis[P];
    bool inQ[P];
    int ans[P];
    queue<int>q;
    int tot=0;
    int min(int x,int y)
    {
    	return x<y?x:y;
    }
    void spfa(int s)
    {
    	memset(dis,0x3f3f,sizeof(dis));
    	dis[s]=0;
    	q.push(s);
    	inQ[s]=1;
    	while(!q.empty())
    	{
    		int p=q.front();
    		q.pop();
    		inQ[p]=0;
    		for(int i=head[p];i;i=nxt[i])
    		{
    			int y=to[i];
    			if(dis[y]>dis[p]+v[i])
    			{
    				dis[y]=dis[p]+v[i];
    				if(inQ[y]==0)
    				q.push(y),inQ[y]=1;
    			}
    		}
    	}
    }
    void add(int x,int y,int z)
    {
    	v[++tot]=z;
    	to[tot]=y;
    	nxt[tot]=head[x];
    	head[x]=tot;	
    }
    int main()
    {
    	int n,f,m;
    	scanf("%d%d%d",&n,&f,&m);
    	for(int i=1;i<=f;i++)
    	scanf("%d",&num[i]);
    	int x,y,z;
    	for(int i=1;i<=m;i++)
    	{
    		scanf("%d%d%d",&x,&y,&z);
    		add(x,y,z);
    		add(y,x,z);
    	}
    	int a=0x3f3f3f3f;
    	for(int i=1;i<=n;i++)
    	{	
    		spfa(i);
    		for(int j=1;j<=f;j++)
    		{
    			ans[i]+=dis[num[j]];
    		}
    	}
    	int b;
    	for(int i=1;i<=n;i++)
    	{
    
    		if(a>ans[i])
    		b=i,a=ans[i];
    	}
    	printf("%d",b);
    }
    

      

  • 相关阅读:
    线性回归的从零开始实现
    比赛总结
    计数学习笔记
    DP计数问题
    多项式学习笔记
    数据结构学习笔记
    子集运算学习笔记
    待学习
    ICPC2018焦作 题解
    ICPC2018焦作 H题 Can You Solve the Harder Problem?
  • 原文地址:https://www.cnblogs.com/Marcelo/p/13444755.html
Copyright © 2011-2022 走看看