链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1142
题目:
5 6 1 3 2 1 4 2 3 4 3 1 5 12 4 2 34 5 2 24 7 8 1 3 1 1 4 1 3 7 1 7 4 1 7 5 1 6 7 1 5 2 1 6 2 1 0
2 4
分析与总结:
做这题真可谓是一波三折, 足足WA了有30+次。
1. 题目意思理解错误。题目中的一段话没理解好:
He considers taking a path from A to B to be progress if there exists a route from B to his home that is shorter than any possible route from A.
这句话的意思是说,对于两点A,B, 如果点B到达家里的最短路距离小于点A到达家里的最短路距离,那么点A就可以到达点B。
而我把这题理解成了求有办公室到家里有多少条不同的最短路。
2. 解决了上述错误之后,接下来可以求出每一点到达点2(家里)的最短路,然后根据所求的各点最短路,求出有多少条到家里的路径。
如果直接搜索是会超时的,所以要用记忆化搜索。
3. 因为自己的粗心, 由于我的程序中有两个数组名为d和dp, 在写记忆话搜索时把这两个数组混淆了,结果又WA了十多次而找不到原因。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<utility> #include<string> #include<map> using namespace std; typedef int Type; typedef pair<Type,int>pii; const Type INF = 0x7fffffff; const int VN = 1005; const int EN = VN*VN; int n,m,size; int head[VN]; Type d[VN]; bool G[VN][VN]; bool vis[VN]; int cnt; int dp[VN]; struct Edge{ int v,next; Type w; }E[EN]; void init(){ size=0; cnt=0; memset(G, 0, sizeof(G)); memset(head, -1, sizeof(head)); memset(dp, -1, sizeof(dp)); } void addEdge(int u,int v,Type w){ E[size].v=v; E[size].w=w; E[size].next=head[u]; head[u]=size++; } void Dijkstra(int src){ for(int i=1; i<=n; ++i) d[i]=INF; d[src] = 0; priority_queue<pii,vector<pii>,greater<pii> >q; q.push(make_pair(d[src],src)); while(!q.empty()){ pii x = q.top(); q.pop(); int u = x.second; if(d[u] != x.first)continue; for(int e=head[u]; e!=-1; e=E[e].next){ Type tmp=d[u]+E[e].w; if(d[E[e].v] > tmp){ d[E[e].v] = tmp; q.push(make_pair(tmp, E[e].v)); } } } } int dfs(int u){ if(dp[u]!=-1) return dp[u]; if(u==2) return 1; int cnt=0; for(int v=1; v<=n; ++v)if(d[v]<d[u] && G[u][v]){ cnt += dfs(v); } dp[u] = cnt; return dp[u]; } int main(){ int u,v; Type w; while(~scanf("%d",&n)&n){ scanf("%d",&m); init(); for(int i=0; i<m; ++i){ scanf("%d%d%d",&u,&v,&w); G[u][v] = G[v][u] = 1; addEdge(u,v,w); addEdge(v,u,w); } Dijkstra(2); printf("%d\n", dfs(1)); } return 0; }
—— 生命的意义,在于赋予它意义。
原创 http://blog.csdn.net/shuangde800 , By D_Double (转载请标明)