POJ - 1797 最短路思想加以变化解此题..

     题目的意思其实是说给一个无向图..并给出两点间的路径..以及路径所能承受的最大重量..问从点1出发..最多能带多重的货物到达点n..使得经过的路径都不会超过最大承受重量..

     就是将求最短路径时..原本每次是更新起点到某点的最短距离,改为起点到某点的最大承重..dijkstra..Bellman-Ford...SPFA都可以...

     我就因为写错一个变量..结果不停的RE..搞得很郁闷..一度怀疑题意理解有问题...耽误了好多时间反复检查..总之还是不够细心...


#include<iostream>
#include<queue>
#include<stdio.h>
#include<math.h>
#define oo 200000000
using namespace std;    
int T,t,n,m,_link[1005]; 
struct node
{
     int x,y,w,next;
}line[2000005];
queue<int> myqueue;
int s[1005];
bool inqueue[1005];
int SPFA()
{
     int i,k,h,x; 
     for (i=1;i<=n;i++)
     {
           s[i]=0;
           inqueue[i]=false;
     }
     while (!myqueue.empty()) myqueue.pop();
     s[1]=oo; 
     myqueue.push(1);
     while (!myqueue.empty())
     {
           h=myqueue.front();
           myqueue.pop();
           inqueue[h]=false;
           k=_link[h];
           while (k)
           {
                x=min(s[h],line[k].w);
                if (s[line[k].y]<x)
                {
                      s[line[k].y]=x;
                      if (!inqueue[line[k].y])
                      {
                            myqueue.push(line[k].y);
                            inqueue[line[k].y]=true;                        
                      }
                }
                k=line[k].next;      
           }
     }
     return s[n];
}
int main()
{  
     freopen("input.txt","r",stdin);
     freopen("output.txt","w",stdout);
     scanf("%d",&T);
     t=0; 
     while (T--)
     { 
           int x,y,z,i;
           scanf("%d%d",&n,&m);
           for (x=1;x<=n;x++) _link[x]=0;
           for (i=1;i<=m;i++)
           {
                 scanf("%d%d%d",&x,&y,&z);
                 line[i*2-1].x=x; line[i*2-1].y=y; line[i*2-1].w=z;
                 line[i*2-1].next=_link[x]; _link[x]=i*2-1;
                 line[i*2].x=y; line[i*2].y=x; line[i*2].w=z;
                 line[i*2].next=_link[y]; _link[y]=i*2;
           }  
           m*=2;    
           printf("Scenario #%d:\n%d\n\n",++t,SPFA());  
     }
     return 0;   
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值