简单最长路径,一个小技巧就是将每条边权值取对数,然后SPFA一次就可以了
#include <iostream> #include <cmath> #include <string.h> using namespace std; const int MAXN = 110; const int MAXM = MAXN*MAXN; struct node { int v, next; double w; }mapp[MAXM]; int id, head[MAXN]; void init() { id = 0; memset(head, -1, sizeof(head)); } void addedge(int u, int v, double w) { mapp[id].v = v, mapp[id].w = w, mapp[id].next = head[u], head[u] = id ++; } bool inque[MAXN]; double dist[MAXN]; int Que[10*MAXM]; int num[MAXN]; const double inf = 10e8; void SPFA(int s, int n) { for (int i = 1; i <= n; i ++){ dist[i] = -inf, inque[i] = false; } int rear, front; rear = front = 0; dist[s] = 0; inque[s] = true; Que[rear ++] = s; while (front < rear){ int pre = Que[front ++]; inque[pre] = false; //cout<<"asasd"<<endl; for (int i = head[pre]; i != -1; i = mapp[i].next){ int v = mapp[i].v; if (dist[v] < mapp[i].w + dist[pre]){ dist[v] = mapp[i].w + dist[pre]; if (!inque[v]){ inque[v] = true; num[v] ++; if (num[v] > 2*n)break; Que[rear ++] = v; } } } } } int main() { int n, m; while (scanf("%d", &n)&& n){ scanf("%d", &m); init(); while (m --){ int a, b, c; scanf("%d%d%d", &a, &b, &c); addedge(a, b, log10(1.0*c/100)); addedge(b, a, log10(1.0*c/100)); } memset(num, 0, sizeof(num)); SPFA(1, n); printf("%.6lf percent\n", 100*pow(10.0, dist[n])); } return 0; }