HDU ACM 1142 A Walk Through the Forest (最短路径Dijkstra + 深搜DFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1142
题意:点1为起点 点2为终点 从点1走到点x点后,要求点x到点2的距离小于点1到点2的距离 统计路径数目.
输入:n为点的数目 m为道路数目
a b c 为 a到b的权值为c
输出:路径数目
思路:用dijkstra +DFS()
dijkstra:找出所有点到点2的最短路径,但是遍历所有点到2在记录会超时,所以用2为起点求到各点的最短路径.
DFS():需要剪枝,否则也会超时 用mark()数组记录之前进行过DFS得点数.
View Code
1 #include <iostream> 2 using namespace std; 3 const int MAX = 1000 + 10; 4 const int INF = 0x3fffffff; 5 int map[MAX][MAX]; 6 int used[MAX]; 7 int dis[MAX]; 8 9 int n; 10 int Dijkstra(int start) 11 { 12 memset(used,0,sizeof(used)); 13 int i; 14 for(i=1;i<=n;i++) 15 { 16 dis[i]= INF; 17 } 18 dis[start] = 0; 19 for(int j=1;j<=n;j++) 20 { 21 int min=INF; 22 int mid=0; 23 for(i=1;i<=n;i++) 24 { 25 if( !used[i] && dis[i]<min ) 26 { 27 min=dis[i]; 28 mid=i; 29 } 30 } 31 used[mid]=1; 32 for(i=1;i<=n;i++) 33 { 34 if( !used[i] && dis[i]>dis[mid]+map[mid][i] && map[mid][i]) 35 { 36 dis[i]=dis[mid]+map[mid][i]; 37 } 38 } 39 } 40 return 1; 41 } 42 int sum; 43 int visit[MAX]; 44 int mark[MAX]; 45 int DFS(int x) 46 { 47 int i; 48 if(mark[x]) 49 { 50 return mark[x]; 51 } 52 if(x == 2) 53 { 54 return 1; 55 } 56 for(i=1;i<=n;i++) 57 { 58 if(visit[i] == 0 && map[x][i] && dis[i] < dis[x]) 59 { 60 mark[x] +=DFS(i); 61 } 62 } 63 return mark[x]; 64 } 65 int main() 66 { 67 int m; 68 while(cin>>n,n) 69 { 70 memset(map,0,sizeof(map)); 71 memset(visit,0,sizeof(visit)); 72 memset(mark,0,sizeof(mark)); 73 cin>>m; 74 int i; 75 for(i=1;i<=m;i++) 76 { 77 int a,b,c; 78 cin>>a>>b>>c; 79 map[a][b] = map[b][a] = c; 80 } 81 Dijkstra(2); 82 cout<<DFS(1)<<endl; 83 } 84 return 0; 85 }