您的位置:首页 > 编程语言 > Go语言

POJ2472 106 miles to Chicago

2011-09-03 10:58 274 查看
简单最长路径,一个小技巧就是将每条边权值取对数,然后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
));
    }
    return 0;    
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: