hdu 1142 dijkstra+dfs A Walk Through the Forest
源地址:http://acm.hdu.edu.cn/showproblem.php?pid=1142
题目大意:起点1,终点2,A与B想邻,如果B到终点的距离小于A到终点的距离,则A到B算一种走法(感觉解释的很烂,还是自已去看原题吧)
思想:求出所有点到2点的距离,用dijkstra,没有什么特别的,接着dfs,从1点开始,对1 点相邻的点并且距离比他短的进行深搜,返回路径数
/*最短路+dfs*/ /*使用了不常用的vector,queue,有错误提醒下*/ #include<iostream> #include<vector> #include<cstdlib> #include<cstring> #include<queue> using namespace std; #define MAXN 1010 #define INF 1000010010 struct mice{ int x,dis; }; int dis[MAXN],vis[MAXN],map[MAXN][MAXN],kind[MAXN]; typedef pair< int ,int >pii; vector < mice > pnt[MAXN]; priority_queue<pii,vector<pii>,greater<pii> >q; int n,m; void dij()//dijkstra求最短路 { int i,j; dis[2]=0; q.push(make_pair(0,2)); while(!q.empty()) { pii tt=q.top(); q.pop(); int v=tt.second; if(vis[v]) continue; vis[v]=1; int s=pnt[v].size(); for(i=0;i<s;i++) { int x,len; x=pnt[v].at(i).x;len=pnt[v].at(i).dis; if(vis[x]==0) { if(dis[x]>dis[v]+len) { dis[x]=dis[v]+len; q.push(make_pair(dis[x],x)); } } } } } void init()//初始化 { for(int i=0;i<=n;i++) { dis[i]=INF; vis[i]=0; kind[i]=-1; pnt[i].clear(); } } int dfs(int x) { if(kind[x]!=-1) return kind[x]; int i,j; int len; int s=pnt[x].size(); int sum=0,y; for(i=0;i<s;i++) { y=pnt[x].at(i).x; if(y==2) { sum++; continue; } if(dis[y]<dis[x]) sum+=dfs(y); } kind[x]=sum;//用kind记录路径数,避免重复搜索 return sum; } int main() { int i,j,k,x,y,z; while(cin>>n,n) { cin>>m; init(); for(i=0;i<m;i++) { cin>>x>>y>>z; mice tt; tt.x=y;tt.dis=z; pnt[x].push_back(tt);//用vector实现与邻接表一样的功能 tt.x=x; pnt[y].push_back(tt); } dij(); int sum=dfs(1); cout<<sum<<endl; } }
学习交流邮箱:810278677@qq.com