标签:style blog io ar for sp on 2014 log
题目大意:寻找一共有多少条符合题意的路。能够从点A走到点B的要求是:点A到终点的最短路 > 点B到终点的最短路。
思路:这时,我们就需要先求出所有点到终点的最短路,即可从终点出发,求出所有路的最短路。然后,我们再用记忆化搜索,求出所有点符合题意的点。
AC代码:
#include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<queue> using namespace std; #define INF 0xfffffff vector<int>road[1005]; int map[1005][1005],d[1005],s[1005];//map记录从i到j的距离, //s为记录当前点符合题意的路的条数 int vis[1005]; int n,m; void spfa() { int i,u; memset(vis,0,sizeof(int)*(n+3)); for(i=1;i<=n;i++)d[i]=INF; d[2]=0; queue<int >q; q.push(2); vis[2]=1; while(!q.empty()) { u=q.front(); q.pop(); vis[u]=0; for(i=1;i<=n;i++) { if(d[i]>d[u]+map[u][i]) { d[i]=d[u]+map[u][i]; if(vis[i]==0) { q.push(i); vis[i]=1; } } } } } int dfs(int u) { int i; if(u==2)return 1; if(s[u])return s[u]; for(i=0;i<road[u].size();i++) { if(d[u]>d[road[u][i]]) { s[u]+=dfs(road[u][i]); } } return s[u]; } int main() { while(scanf("%d",&n)!=EOF) { int i,j; if(n==0)break; scanf("%d",&m); memset(s,0,sizeof(int)*(n+3)); for(i=0;i<=n;i++)road[i].clear(); for(i=0;i<=n;i++) for(j=0;j<=n;j++) { if(i==j)map[i][j]=0; else map[i][j]=INF; } while(m--) { int u,v,w; scanf("%d %d %d",&u,&v,&w); map[u][v]=map[v][u]=w; road[u].push_back(v); road[v].push_back(u); } spfa(); printf("%d\n",dfs(1)); } return 0; }
hdu1142 A Walk Through the Forest
标签:style blog io ar for sp on 2014 log
原文地址:http://blog.csdn.net/u012313382/article/details/40859655