Uva 10917
題目鏈接:http://vjudge.net/contest/143062#problem/A
題意:一個人要從點1去到點2,中間還有很多點和很多條邊。問你如果他每次走的邊(a,b)都滿足:a點到目標點的最短距離<b點到目標點的最短距離,那么他從點1出發到點2總共有多少條路徑。
分析:
從家出發使用dijkstra,題目的條件"存在一條從B出發回家的路徑,比所有從A出發的路徑都短",實際上就是 d[B] < d[A],這樣,就有:一條有向邊 A->B,建立新圖。從起點出發到終點有多少條路。DAG模型。
?
#include <bits/stdc++.h> using namespace std;const int maxn = 1000+ 10; const int INF = 0x3f3f3f3f;struct Edge {int from,to,dist; };struct HeapNode {int d,u;bool operator < (const HeapNode& rhs) const{return d > rhs.d;} };struct Dijkstra {int n,m;vector<Edge> edges;vector<int> G[maxn];bool done[maxn];int d[maxn];int p[maxn];void init(int n){this->n = n;for(int i=0; i<n; i++)G[i].clear();edges.clear();}void AddEdge(int from,int to,int dist){edges.push_back((Edge){from,to,dist});m = edges.size();G[from].push_back(m-1);}void dijkstra(int s){priority_queue<HeapNode> Q;for(int i=0; i<n; i++)d[i] = INF;d[s] = 0;memset(done,0,sizeof(done));Q.push((HeapNode){0,s});while(!Q.empty()){HeapNode x = Q.top();Q.pop();int u = x.u;if(done[u]) continue;for(int i=0; i<G[u].size(); i++){Edge& e = edges[G[u][i]];if(d[e.to]>d[u]+e.dist){d[e.to] = d[u] + e.dist;p[e.to] = G[u][i];Q.push((HeapNode){d[e.to],e.to});}}}} };Dijkstra solve; int d[maxn];int dp(int u) {if(u==1) return 1;int& ans = d[u];if(ans>=0) return ans;ans = 0;for(int i=0; i<solve.G[u].size(); i++){int v = solve.edges[solve.G[u][i]].to;if(solve.d[v]<solve.d[u]) ans +=dp(v);}return ans; }int main() {int n,m;while(scanf("%d",&n),n){scanf("%d",&m);solve.init(n);for(int i=0; i<m; i++){int u,v,d;scanf("%d%d%d",&u,&v,&d);u--;v--;solve.AddEdge(u,v,d);solve.AddEdge(v,u,d);}solve.dijkstra(1);memset(d,-1,sizeof(d));printf("%d\n",dp(0));}return 0; }?
轉載于:https://www.cnblogs.com/TreeDream/p/6103887.html
總結
- 上一篇: 在spring boot 配置actua
- 下一篇: sprintf_s的使用