zoukankan      html  css  js  c++  java
  • hdu 1224 Free DIY Tour(最长的公路/dp)

    http://acm.hdu.edu.cn/showproblem.php?

    pid=1224


    基础的求最长路以及记录路径。

    感觉dijstra不及spfa好用,wa了两次。

    #include <stdio.h>
    #include <algorithm>
    #include <set>
    #include <map>
    #include <vector>
    #include <math.h>
    #include <string.h>
    #include <queue>
    #define LL long long
    #define _LL __int64
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int maxn = 110;
    
    int n,m;
    int inter[maxn];
    int Map[maxn][maxn];
    int dis[maxn],vis[maxn];
    int pre[maxn];
    
    void debug()
    {
    	for(int i = 1; i <= n+1; i++)
    	{
    		for(int j = 1; j <= n+1; j++)
    			printf("%d ",Map[i][j]);
    		printf("
    ");
    	}
    }
    
    void spfa()
    {
    	queue <int> que;
    	memset(vis,0,sizeof(vis));
    	memset(dis,-INF,sizeof(dis));
    	memset(pre,-1,sizeof(pre));
    
    	dis[1] = 0;
    	vis[1] = 1;
    	que.push(1);
    
    	while(!que.empty())
    	{
    		int u = que.front();
    		que.pop();
    		vis[u] = 0;
    
    		for(int v = 1; v <= n+1; v++)
    		{
    			if(Map[u][v] >= 0&& dis[v] < dis[u] + Map[u][v])
    			{
    				dis[v] = Map[u][v] + dis[u];
    				pre[v] = u;
    				if(!vis[v])
    				{
    					vis[v] = 1;
    					que.push(v);
    				}
    			}
    		}
    	}
    }
    
    void output()
    {
    	int t = n+1;
    	int ans[maxn];
    	int cnt = 0;
    	while(pre[t] != -1)
    	{
    		ans[cnt++] = t;
    		t = pre[t];
    	}
    
    	printf("1");
    	for(int i = cnt-1; i >= 1; i--)
    		printf("->%d",ans[i]);
    	printf("->1
    ");
    }
    
    int main()
    {
    	int test;
    	int u,v;
    	scanf("%d",&test);
    	for(int item = 1; item <= test; item++)
    	{
    		if(item != 1)
    			printf("
    ");
    
    		scanf("%d",&n);
    		for(int i = 1; i <= n; i++)
    			scanf("%d",&inter[i]);
    		inter[n+1] = 0;
    
    		memset(Map,-1,sizeof(Map));
    
    		scanf("%d",&m);
    		while(m--)
    		{
    			scanf("%d %d",&u,&v);
    			Map[u][v] = inter[v];
    		}
    
    		spfa();
    
    		printf("CASE %d#
    ",item);
    		printf("points : %d
    ",dis[n+1]);
    		printf("circuit : ");
    		output();
    
    
    	}
    	return 0;
    
    }

    求最长路有点像最长上升子序列,再拿最长上升子序列水一水。

    #include <stdio.h>
    #include <algorithm>
    #include <set>
    #include <map>
    #include <vector>
    #include <math.h>
    #include <string.h>
    #include <queue>
    #define LL long long
    #define _LL __int64
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int maxn = 110;
    
    int n,m;
    int inter[maxn];
    int Map[maxn][maxn];
    int dis[maxn],vis[maxn];
    int pre[maxn];
    int dp[maxn];
    
    void solve()
    {
    	memset(pre,-1,sizeof(pre));
    
    	for(int i = 1; i <= n+1; i++)
    	{
    		dp[i] = inter[i];
    		for(int j = 1; j < i; j++)
    		{
    			if( Map[j][i] >= 0 && dp[i] < dp[j] + Map[j][i])
    			{
    				dp[i] = dp[j] + Map[j][i];
    				pre[i] = j;
    			}
    		}
    	}
    
    	printf("points : %d
    ",dp[n+1]);
    	printf("circuit : ");
    
    	int ans[maxn],cnt = 0;
    	int t = n+1;
    	while(t != -1)
    	{
    		ans[cnt++] = t;
    		t = pre[t];
    	}
    	ans[cnt] = 1;
    
    	for(int i = cnt; i >= 1; i--)
    		printf("%d->",ans[i]);
    	printf("%d
    ",1);
    }
    
    int main()
    {
    	int test;
    	int u,v;
    	scanf("%d",&test);
    	for(int item = 1; item <= test; item++)
    	{
    		if(item != 1)
    			printf("
    ");
    
    		scanf("%d",&n);
    		for(int i = 1; i <= n; i++)
    			scanf("%d",&inter[i]);
    		inter[n+1] = 0;
    
    		memset(Map,-1,sizeof(Map));
    
    		scanf("%d",&m);
    		while(m--)
    		{
    			scanf("%d %d",&u,&v);
    			Map[u][v] = inter[v];
    		}
    		printf("CASE %d#
    ",item);
    		solve();
    	}
    	return 0;
    }



  • 相关阅读:
    Azure 中 Linux 虚拟机的大小
    排查在 Azure 中创建、重启 Linux VM 或调整其大小时发生的分配故障
    如何在 Azure 中的 Linux 经典虚拟机上设置终结点
    针对通过 SSH 连接到 Azure Linux VM 时发生的失败、错误或被拒绝问题进行故障排除
    Linux 内核超时导致虚拟机无法正常启动
    Java并发编程(十三)同步容器类
    可以开发着玩一下的web项目
    org.tmatesoft.svn.core.SVNCancelException: svn: E200015: authentication canc
    FastDFS单机搭建以及java客户端Demo
    做前端(单纯页面和js)遇到的问题辑录(一)
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4600505.html
Copyright © 2011-2022 走看看