某同学给的题。。。发现这三个OJ都有。。。啊。。我是不是很无聊。。。
他给我叙述的是从1到2有多少条最短路。。结果死活不过。。
去官网下了数据,发现跑得不对,和他的答案一样,然后我俩就怀疑理解错题意了,囧。。
果不其然。。。
重点是这句话 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.
也就是,选B的话保证B到house的最短路比A到house的最短路小。
所以需要从house 到 office 求最短路,然后类似SPFA 的BFS一下就可以。
为了保证效率,如果入队的就不要再次入队了,查询过它周围点的这个点,需要把他的记录给清空,要不下一次再查到他,会加重。
搜了下题解,发现大部分用的DFS记忆化搜索。。。我表示不太会用。。。
不过我这个时间不算差。ZOJ第一版~
#include <set> #include <map> #include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <string> #include <algorithm> #define MID(x,y) ( ( x + y ) >> 1 ) #define L(x) ( x << 1 ) #define R(x) ( x << 1 | 1 ) #define FOR(i,s,t) for(int i=(s); i<(t); i++) #define BUG puts("here!!!") #define STOP system("pause") #define file_r(x) freopen(x, "r", stdin) #define file_w(x) freopen(x, "w", stdout) using namespace std; const int MAX = 1010; typedef struct NODE{ int to,len; NODE *next; }NODE; NODE *p[MAX],node[MAX*MAX]; int cou; void init() { cou = 0; memset(p, 0, sizeof(p)); } void Add(int from,int to,int len) { node[cou].next = p[from]; node[cou].to = to; node[cou].len = len; p[from] = &node[cou++]; } int dis[MAX]; int BFS(int s, int t) { int sum = 0; int num[MAX]; bool inq[MAX]; memset(inq, false, sizeof(inq)); memset(num, 0, sizeof(num)); queue<int> q; q.push(s); num[s] = 1; inq[s] = true; while( !q.empty() ) { int now = q.front(); q.pop(); inq[now] = false; NODE *head = p[now]; while( head ) { int to = head->to; if( dis[to] > dis[now] ) { num[to] += num[now]; if( !inq[to] && to != t ) { inq[to] = true; q.push(to); } } head = head->next; } num[now] = 0; // 这个很重要,因为如果不清空,下次又要加上了 } return num[t]; } int SPFA_List(int from,int to,int n) { queue<int> q; bool inq[MAX]; for(int i=1; i<=n; i++) dis[i] = INT_MAX; memset(inq,false,sizeof(inq)); dis[from] = 0; q.push(from); inq[from] = 1; while( !q.empty() ) { int now = q.front(); q.pop(); inq[now] = false; NODE *head = p[now]; while( head != NULL ) { int v = head->to; int len = head->len; if( dis[v] > dis[now] + len ) { dis[v] = dis[now] + len; if( !inq[v] ) { inq[v] = true; q.push(v); } } head = head->next; } } if( dis[to] == INT_MAX ) return 0; return BFS(from, to); } int main() { int n, m, u, v, w; while( ~scanf("%d", &n) && n ) { scanf("%d", &m); init(); while( m-- ) { scanf("%d%d%d", &u, &v, &w); Add(u, v, w); Add(v, u, w); } int ans = SPFA_List(2, 1, n); printf("%d\n", ans); } return 0; }