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

    #include <stdio.h>
    #include <string.h>
    #define MAX 1001

    const int INF= 0x7f7f7f7f;

    int t,s,d,tt[MAX][MAX],ss[MAX],dd[MAX],path[MAX],maxs;

    int min(int n,int m)
    {
    return n>m?m:n;
    }

    void init()
    {
    int i;
    memset(path,INF,sizeof(path));
    memset(tt,INF,sizeof(tt));

    for(i=0;i<MAX;i++)
    {
    ss[i]=0;
    dd[i]=0;
    }
    }

    int dijkstra(int n)
    {
    int i,j,k;

    int vis[1024]={0};

    for(i=0;i<maxs;i++)//可以优化节省大量时间
    {
    path[i]=tt[n][i];
    }

    vis[n]=1;

    for(path[n]=0,i=0;i<maxs;i++)
    {
    for(k=-1,j=1;j<=maxs;j++)
    if(!vis[j]&&(k==-1||path[j]<path[k]))
    k=j;

    for(vis[k]=1,j=1;j<=maxs;j++)
    if(!vis[j]&&(tt[k][j]!=INF))
    path[j]=min(tt[k][j]+path[k],path[j]);
    }

    int mint=INF;
    for(i=0;i<maxs;i++)
    if(dd[i])
    if(mint>path[dd[i]])
    mint=path[dd[i]];
    return mint;

    }

    int main()
    {
    int i,j,start,end,lon,mins,l;

    while(scanf("%d%d%d",&t,&s,&d)!=EOF)
    {
    init();
    maxs=0;
    for(i=0;i<t;i++)
    {
    scanf("%d%d%d",&start,&end,&lon);
    if(maxs<start)
    maxs=start;
    if(maxs<end)
    maxs=end;
    if(tt[start][end]>lon)
    {
    tt[start][end]=lon;
    tt[end][start]=lon;
    }
    //rem[start][end]=lon;
    //rem[end][start]=lon;
    }



    for(i=0;i<s;i++)
    {
    scanf("%d",&ss[i]);
    tt[0][ss[i]]=0;
    tt[ss[i]][0]=0;
    }


    for(i=0;i<d;i++)
    {
    scanf("%d",&dd[i]);
    }

    mins=INF;

    for(i=0;i<s;i++)
    {
    dijkstra(ss[i]);

    int y=dijkstra(ss[i]);

    if(mins>y)
    mins=y;

    }

    printf("%d\n",mins);
    }

    return 0;
    }


    一直是tle,后来找到path[]数组的优化方案,先初始化为tt[]的距离,大量节省了

    dijkstra的时间,还有是注意初始化边顶点从0开始(不知道为什么)。

    #include <stdio.h>
    #include <string.h>
    #define MAX 1001
    
    const int INF= 0x7f7f7f7f;
    
    int t,s,d,tt[MAX][MAX],ss[MAX],dd[MAX],path[MAX],maxs;
    
    int min(int n,int m)
    {
    	return n>m?m:n;
    }
    
    void init()
    {
    	int i;
    	memset(path,INF,sizeof(path));
    	memset(tt,INF,sizeof(tt));
    
    	for(i=0;i<MAX;i++)
    	{
    		ss[i]=0;
    		dd[i]=0;
    	}
    }
    
    int dijkstra(int n)
    {
    	int i,j,k;
    
    	int vis[1024]={0};
    
    	for(i=0;i<maxs;i++)//可以优化节省大量时间
    	{
    		path[i]=tt[n][i];
    	}
    
    	vis[n]=1;
    
    	for(path[n]=0,i=0;i<maxs;i++)
    	{
    		for(k=-1,j=0;j<maxs;j++)
    			if(!vis[j]&&(k==-1||path[j]<path[k]))
    				k=j;
    
    		for(vis[k]=1,j=0;j<maxs;j++)
    			if(!vis[j]&&(tt[k][j]!=INF))
    				path[j]=min(tt[k][j]+path[k],path[j]);
    	}
    
    	int mint=INF;
    	for(i=0;i<maxs;i++)
    		if(dd[i])
    			if(mint>path[dd[i]])
    				mint=path[dd[i]];
    	return mint;
    
    }
    
    int main()
    {
    	int i,j,start,end,lon,mins,l;
    
    	while(scanf("%d%d%d",&t,&s,&d)!=EOF)
    	{
    		init();
    		maxs=0;
    		for(i=0;i<t;i++)
    		{
    			scanf("%d%d%d",&start,&end,&lon);
    			if(maxs<start)
    				maxs=start;
    			if(maxs<end)
    				maxs=end;
    			if(tt[start-1][end-1]>lon)
    			{
    				tt[start-1][end-1]=lon;
    				tt[end-1][start-1]=lon;
    			}
    			//rem[start][end]=lon;
    			//rem[end][start]=lon;
    		}
    
    
    
    		for(i=0;i<s;i++)
    		{
    			scanf("%d",&ss[i]);
    			ss[i]--;
    		}
    
    
    		for(i=0;i<d;i++)
    		{
    			scanf("%d",&dd[i]);
    			dd[i]--;
    		}
    
    		mins=INF;
    
    		for(i=0;i<s;i++)
    		{
    			dijkstra(ss[i]);
    
    			int y=dijkstra(ss[i]);
    
    			if(mins>y)
    				mins=y;
    
    		}
    
    		printf("%d\n",mins);
    	}
    
    	return 0;
    }
    

      输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
    接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b
    之间可能有多条路)
    接着的第T+1行有S个数,表示和草儿家相连的城市;
    接着的第T+2行有D个数,表示草儿想去地方。

  • 相关阅读:
    Django~1
    Codeforces Round#201(div1) D. Lucky Common Subsequence
    ACdream原创群赛(18)のAK's dream题解
    区间dp
    部署AlwaysOn第三步:集群资源组的健康检测和故障转移
    Join 和 App
    SSRS配置1:凭证和邮件
    巧用Alt 键
    把Excel的数据导入到数据库
    jvm系列:Java GC 分析
  • 原文地址:https://www.cnblogs.com/jackes/p/2426686.html
Copyright © 2011-2022 走看看