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

来源:互联网 发布:嵌入式c语言应用领域 编辑:程序博客网 时间:2024/05/22 13:14

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

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

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


#include<iostream>#include<queue>#include<stdio.h>#include<math.h>#define oo 200000000using 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;   }


原创粉丝点击