Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
注意:题目中起点和终点并不对等!!!#include <cstdio> #include <cstring> #include <climits> #include <utility> #include <queue> #include <vector> using namespace std; #define MAX 1005 typedef pair<int,int> PII; const int OFFICE = 1; const int HOME = 2; int N, M; vector<PII> neighbour[MAX]; int dis[MAX], path[MAX]; queue<int> q; bool inq[MAX]; bool init() { if(scanf("%d", &N), !N) return false; scanf("%d", &M); int i, x, y, d; for(i = 1; i <= N; ++i){ inq[i] = false; dis[i] = INT_MAX; path[i] = 0; neighbour[i].clear(); } for(i = 0; i < M; ++i){ scanf("%d%d%d", &x, &y, &d); neighbour[x].push_back(PII(y, d)); neighbour[y].push_back(PII(x, d)); } return true; } void spfa(int x) { dis[x] = 0; q.push(x); inq[x] = true; while(!q.empty()){ x = q.front(); q.pop(); inq[x] = false; const vector<PII>& v = neighbour[x]; for(int i = v.size() - 1; i > -1; --i){ int y = v[i].first, d = v[i].second; if(dis[y] > dis[x] + d){ dis[y] = dis[x] + d; if(!inq[y]){ q.push(y); inq[y] = true; } } } } } int dp(int x) { if(x == HOME) return 1; if(path[x]) return path[x]; const vector<PII>& v = neighbour[x]; for(int i = v.size() - 1; i > -1; --i){ int y = v[i].first; if(dis[x] > dis[y]) path[x] += dp(y); } return path[x]; } int main() { while(init()){ spfa(HOME); printf("%d\n", dp(OFFICE)); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator