hdu1224 dp spfa

dp:

 1 //Accepted    300 KB    15 ms
 2 //dp时用到了a[n+1]可是一直没把她赋值,WA了无数次
 3 //dp[i]=max(dp[j]+a[i]) j<i map[j][i]=1
 4 #include <cstdio>
 5 #include <cstring>
 6 #include <iostream>
 7 using namespace std;
 8 const int imax_n = 105;
 9 const int inf = -100000000;
10 int map[imax_n][imax_n];
11 int dp[imax_n];
12 int a[imax_n];
13 int pre[imax_n];
14 int n,m;
15 void Dp()
16 {
17     for (int i=1;i<=n+1;i++)
18     {
19         dp[i]=inf;
20     }
21     dp[1]=0;
22     for (int i=2;i<=n+1;i++)
23     {
24         for (int j=1;j<i;j++)
25         if (map[j][i]==1)
26         {
27             if (dp[i]<dp[j]+a[i])
28             dp[i]=dp[j]+a[i],pre[i]=j;
29         }
30     }
31 }
32 void output(int x)
33 {
34     if (x==1)
35     {
36         printf("1");
37         return ;
38     }
39     output(pre[x]);
40     printf("->%d",x);
41 }
42 int main()
43 {
44     int T;
45     scanf("%d",&T);
46     for (int t=1;t<=T;t++)
47     {
48         scanf("%d",&n);
49         for (int i=1;i<=n;i++)
50         scanf("%d",&a[i]);
51         a[n+1]=0;
52         scanf("%d",&m);
53         int x,y;
54         memset(map,0,sizeof(map));
55         for (int i=0;i<m;i++)
56         {
57             scanf("%d%d",&x,&y);
58             map[x][y]=1;
59         }
60         Dp();
61         if (t!=1) printf("\n");
62         printf("CASE %d#\n",t);
63         printf("points : %d\n",dp[n+1]);
64         printf("circuit : ");
65         output(pre[n+1]);
66         printf("->1\n");
67     }
68     return 0;
69 }

spfa:

  1 //Accepted    440 KB    0 ms
  2 //spfa
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <iostream>
  6 #include <queue>
  7 #include <string.h>
  8 using namespace std;
  9 const int imax_n = 201;
 10 const int imax_e = imax_n*imax_n;
 11 const int inf = -100000000;
 12 struct edge
 13 {
 14     int u,v,c;
 15     edge()
 16     {
 17
 18     }
 19     edge(int u,int v,int c):u(u),v(v),c(c)
 20     {
 21
 22     }
 23 }p[imax_e];
 24
 25 int head[imax_n];
 26 int next[imax_e];
 27 int vis[imax_n];
 28 int total_interesting_point[imax_n];
 29 int interesting_point[imax_n];
 30 int e;
 31 int n,m;
 32
 33 void init()
 34 {
 35     memset(head,-1,sizeof(head));
 36     memset(next,-1,sizeof(next));
 37     memset(vis,0,sizeof(vis));
 38     e=0;
 39 }
 40 void addEdge(int u,int v,int c)
 41 {
 42     p[e]=edge(u,v,c);
 43     next[e]=head[u];
 44     head[u]=e++;
 45 }
 46 void outputTrack(int x)
 47 {
 48     if (x==1)
 49     {
 50         return ;
 51     }
 52     for (int i=1;i<=n;i++)
 53     if (total_interesting_point[i]+interesting_point[x]==total_interesting_point[x])
 54     {
 55         outputTrack(i);
 56         printf("%d->",i);
 57         return ;
 58     }
 59 }
 60 queue<int > q;
 61 void Dp()
 62 {
 63     for (int i=1;i<=n+1;i++)
 64     total_interesting_point[i]=inf;
 65     total_interesting_point[1]=0;
 66     while (!q.empty()) q.pop();
 67     q.push(1);
 68     vis[1]=true;
 69     while (!q.empty())
 70     {
 71         int x=q.front();
 72         q.pop();
 73         vis[x]=false;
 74         for (int i=head[x];i!=-1;i=next[i])
 75         {
 76             int nx=p[i].v;
 77             if (x<nx && total_interesting_point[nx]<total_interesting_point[x]+interesting_point[nx])
 78             {
 79                 total_interesting_point[nx]=total_interesting_point[x]+interesting_point[nx];
 80                 if (!vis[nx])
 81                 {
 82                     q.push(nx);
 83                     vis[nx]=true;
 84                 }
 85             }
 86         }
 87     }
 88     printf("points : %d\n",total_interesting_point[n+1]);
 89     printf("circuit : ");
 90     outputTrack(n+1);
 91     printf("1\n");
 92 }
 93 int main()
 94 {
 95     int T;
 96     scanf("%d",&T);
 97     for (int t=1;t<=T;t++)
 98     {
 99         scanf("%d",&n);
100         for (int i=1;i<=n;i++)
101         scanf("%d",&interesting_point[i]);
102         interesting_point[n+1]=0;
103         init();
104         scanf("%d",&m);
105         int x,y;
106         for (int i=0;i<m;i++)
107         {
108             scanf("%d%d",&x,&y);
109             addEdge(x,y,0);
110         }
111         if (t!=1) printf("\n");
112         printf("CASE %d#\n",t);
113         Dp();
114     }
115     return 0;
116 }

hdu1224 dp spfa

时间: 2024-10-10 01:59:27

hdu1224 dp spfa的相关文章

POJ 3182 The Grove [DP(spfa) 射线法]

题意: 给一个地图,给定起点和一块连续图形,走一圈围住这个图形求最小步数 本来是要做课件上一道$CF$题,先做一个简化版 只要保证图形有一个点在走出的多边形内就可以了 $hzc:$动态化静态的思想,假设已经有了路线怎么判断合法 点在多边形内是“点变多边形不变”,我们反过来维护多边形变 $f[i][j][0/1]$表示当前走到$(i,j)$,点是否在多边形内 维护一条向右发出的射线,每次走的时候看看有没有穿过射线就行了 因为这是个网格,我们可以规定只有从上面经过才算穿过 然后,这不是$DAG$啊怎

值得一做》关于一道DP+SPFA的题 BZOJ1003 (BZOJ第一页计划) (easy+)

这是一道数据范围和评测时间水的可怕的题,只是思路有点难想,BUT假如你的思路清晰,完全了解怎么该做,那就算你写一个反LLL和反SLE都能A,如此水的一道题,你不心动吗? 下面贴出题目 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪.由于各种因素的存在,有的时候某个码头会无法装卸货物.这时候就必须修改运输路线,让货物能够按时到达目的地

HDU 4284 状压dp+spfa堆优化

题意: 给定n个点 m条无向边 d元. 下面m行表示每条边 u<=>v 以及花费 w 下面top 下面top行 num c d 表示点标为num的城市 工资为c 健康证价格为d 目标是经过给定的top个城市,当到达该城市时,必须马上购买该城市的健康证并打工赚钱(每个城市只打工1次) 问从1城市出发,最后回到1城市,能否收集到所有的健康证 思路: 由于top很小,所以状压dp dp[i][tmp]表示当前处于i点 经过城市的状态为tmp时 身上最多的钱. 首先对dis数组floyd 跑出最短路,

HDU 4085 Peach Blossom Spring 斯坦纳树 状态压缩DP+SPFA

状态压缩dp+spfa解斯坦纳树 枚举子树的形态 dp[i][j] = min(dp[i][j], dp[i][k]+dp[i][l]) 其中k和l是对j的一个划分 按照边进行松弛 dp[i][j] = min(dp[i][j], dp[i'][j]+w[i][j])其中i和i'之间有边相连 #include <cstdio> #include <cstring> #include <queue> using namespace std; const int maxn

POJ2686 Traveling by Stagecoach(状压DP+SPFA)

题目大概是给一张有向图,有n张票,每张票只能使用一次,使用一张票就能用pi匹马拉着走过图上的一条边,走过去花的时间是边权/pi,问从a点走到b点的最少时间是多少. 用dp[u][S]表示当前在u点且用过的票集合是S的最少时间,丢进SPFA更新. 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 #define INF 1e8 6 #define MAXN 3

【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)

2595: [Wc2008]游览计划 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1572  Solved: 739 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点:否则表示控制该方块至少需要的志愿者数目. 相邻的整数用 (若干个) 空格隔开,行首行末也可能有多余的空格. Output 由 N

ZOJ1027 Travelling Fee(DP+SPFA)

给一张有向无环图,边都有花费,从某点到某点走的那条路径上的那一条花费最多的边可以省掉,问从起点到终点的最少花费的多少, 往DP想的话,就可以写出这个状态dp[u][mx],表示到达u点已经省掉的花费为mx的最少花费. 用SPFA更新转移方程..或者理解成队列+我为人人的转移..其实这题这样子也能解有环图. 看了别人博客,发现还有三种解法: 枚举每一条边作为省掉的边,n次SPFA.这方法简洁,可惜想不出= = 跑Dijkstra,根据记录到每一点时的最长边更新,正确性不懂.. Floyd+DP:加

HDU3768 Shopping(状态压缩DP+spfa)旅行商问题

Shopping Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 577    Accepted Submission(s): 197 Problem Description You have just moved into a new apartment and have a long list of items you need

Codeforces Round #108 (Div. 2)——状态压缩DP+spfa+dfs——Garden

Vasya has a very beautiful country garden that can be represented as an n × m rectangular field divided into n·m squares. One beautiful day Vasya remembered that he needs to pave roads between k important squares that contain buildings. To pave a roa