• hdu 2680 Choose the best route


    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2680

    简单最短路问题。。。。。

    运行结果:

    Accepted 2680 265MS 4164K 1382 B C++
    //dijkstra
    #include<stdio.h>
    #define INF (1<<30)
    #define MAXN 1005
    int map[MAXN][MAXN],n,m,s,d[MAXN],dis[MAXN];
    bool vis[MAXN];
    void dijkstra(int start)
    {
    	int i,j,k;
    	for(i = 1; i <= n; i++)//初始化所有点为未访问过,起点到所有其他点的距离为无穷远
    		vis[i] = false,dis[i] = INF;
    	//将起点到个顶点的距离保存在dis数组中
    	for(i = 1; i <= n; i++)
    		dis[i] = map[start][i];
    	//起点到其本身的距离为0,并将其标记为已经访问过
    	dis[start] = 0;
    	vis[start] = true;
    	//在将n-1个顶点加入到最短路中
    	for(i = 1; i < n; i++)
    	{
    		int min = INF;
    		for(j = 1; j <= n; j++)
    		{
    			if(!vis[j] && dis[j] < min)
    			{
    				min = dis[j];
    				k = j;
    			}
    		}
    		if(min == INF)
    			continue;
    		vis[k] = true;
    		for(j = 1; j <= n; j++)
    		{
    			if( !vis[j] && dis[j] > min + map[k][j])
    				dis[j] = min + map[k][j];
    		}
    	}
    }
    int main()
    {
    	int i,j,start,end,cost,w;
    	while(scanf("%d%d%d",&n,&m,&s) != EOF)
    	{
    		for(i = 0; i <= n; i++)
    			for(j = 0; j <= n; j++)
    			{
    				map[i][j] = (i == j ? 0 : INF);
    			}
    		for(i = 0; i < m; i++)
    		{
    			scanf("%d%d%d",&end,&start,&cost);
    			if(map[start][end] > cost)
    				map[start][end] = cost;
    		}
    		dijkstra(s);
    		scanf("%d",&w);
    		int min = INF;
    		while( w-- )
    		{
    			scanf("%d",&end);
    			if(dis[end] < min)
    				min = dis[end];
    		}
    		if(min == INF)
    			printf("-1\n");
    		else
    			printf("%d\n",min);
    	}
    	return 0;
    }
    


    运行结果:

    Accepted 2680 125MS 496K 1270 B C++
    //spfa
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    #define INF (1<<30)
    struct node
    {
    	int v,cost;
    	node *next;
    }*head[1005],edge[20005];
    int dis[1005];
    bool vis[1005];
    int n,m,s;
    queue<int> que;
    void spfa(int start)
    {
    	int i = 0;
    	for(i = 1; i <= n; i++)
    		dis[i] = INF;
    	memset(vis,false,sizeof(vis));
    	vis[start] = true;
    	dis[start] = 0;
    	que.push(start);
    	while( !que.empty() )
    	{
    		int now = que.front();
    		que.pop();
    		vis[now] = false;
    		for(node *p = head[now]; p ; p = p->next)
    		{
    			if(dis[p->v] > dis[now] + p->cost)
    			{
    				dis[p->v] = dis[now] + p->cost;
    				if( !vis[p->v])
    				{
    					vis[p->v] = true;
    					que.push(p->v);
    				}
    			}
    		}
    	}
    }
    int main()
    {
    	int i,start,end,cost,w,min;
    	node *p;
    	while(scanf("%d%d%d",&n,&m,&s) != EOF)
    	{
    		for(i = 1; i <= n; i++)
    			head[i] = NULL;
    		 p = edge;
    		for(i = 0; i < m; i++)
    		{
    			scanf("%d%d%d",&start,&end,&cost);
    			p->v = start;p->cost = cost;
    			p->next = head[end];
    			head[end] = p++;
    		}
    		spfa(s);
    		scanf("%d",&w);
    		min = INF;
    		while( w-- )
    		{
    			scanf("%d",&start);
    			if(dis[start] < min)
    				min = dis[start];
    		}
    		if(min == INF)
    			printf("-1\n");
    		else
    			printf("%d\n",min);
    	}
    	return 0;
    }


     

  • 相关阅读:
    指针系统学习5-对使用字符指针变量和字符数组的讨论
    指针系统学习4-字符串与指针
    指针系统学习3-多维数组与指针
    指针系统学习2
    指针系统学习1
    你视为意见领袖的大 V,可能只是个僵尸号
    phpinfo()
    用shell脚本守护后台进程
    mysql命令(command)
    MySQL数据库视图(view),视图定义、创建视图、修改视图
  • 原文地址:https://www.cnblogs.com/LUO257316/p/3220864.html
Copyright © 2020-2023  润新知