zoukankan      html  css  js  c++  java
  • hdu 2066 最短路水题

    题意:给出多个可选择的起始点和终点,求最短路

    思路:执行起始点次的spfa即可

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define MAXN   1100
    #define MAXM   5000
    #define inf 2000000000
    struct Edge
    {
    	int to,next;
    	int time;
    }edge[MAXM];
    int ans,tot;
    int pre[MAXM],head[MAXM],que[MAXM];
    int vis[MAXM],dis[MAXM],tar[MAXN];
    void addedge(int u,int v,int c)
    {
    	edge[tot].to=v;
    	edge[tot].next=head[u];
    	edge[tot].time=c;
    	head[u]=tot++;
    	edge[tot].to=u;
    	edge[tot].next=head[v];
    	edge[tot].time=c;
    	head[v]=tot++;
    }
    void spfa(int s)
    {
    	memset(vis,0,sizeof(vis));
    	for(int i=0;i<MAXN;i++)
    		dis[i]=inf;
    	dis[s]=0;
    	vis[s]=true;
    	int front,rear;
    	front=rear=0;
    	que[rear++]=s;
    	while(front!=rear)
    	{
    		int pre=que[front++];
    		vis[pre]=true;
    		int v;
    		for(int j=head[pre];j!=-1;j=edge[j].next)
    		{
    			v=edge[j].to;
    			if(dis[v]>dis[pre]+edge[j].time)
    			{
    				dis[v]=dis[pre]+edge[j].time;
    				if(tar[v]==1)
    				{
    					if(dis[v]<ans)
    						ans=dis[v];
    				}
    				if(!vis[v])
    				{
    					vis[v]=true;
    					que[rear++]=v;
    				}
    			}
    		}
    		vis[pre]=false;
    	}
    }
    void Init()
    {
    	tot=0;
    	memset(head,-1,sizeof(head));
    }
    int si[MAXN];
    int main()
    {
    	int T,S,D;
    	while(scanf("%d%d%d",&T,&S,&D)!=EOF)
    	{
    		int a,b,c;
    		Init();
    		ans=inf;
    		for(int i=0;i<T;i++)
    		{
    			scanf("%d%d%d",&a,&b,&c);
    			addedge(a,b,c);
    		}
    
    		memset(tar,0,sizeof(tar));
    		for(int i=0;i<S;i++)
    		{
    			scanf("%d",&si[i]);
    		}
    		for(int i=0;i<D;i++)
    		{
    			scanf("%d",&a);
    			tar[a]=1;
    		}
    		for(int i=0;i<S;i++)
    		{
    			spfa(si[i]);
    		}
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    


     

  • 相关阅读:
    【C++基础】重载,覆盖,隐藏
    【Lintcode】003.Digit Counts
    【C++ Primer 5th】Chapter 15
    【Lintcode】120.Word Ladder
    牛客网上的题
    二叉树中和为某个值得路径
    数据库
    二叉搜索树的后序遍历序列
    从上往下打印二叉树
    二叉树的镜像
  • 原文地址:https://www.cnblogs.com/amourjun/p/5134098.html
Copyright © 2011-2022 走看看