HDOJ-2112 略坑爹的SPFA模板题

来源:互联网 发布:网络上被诈骗了怎么办 编辑:程序博客网 时间:2024/05/21 21:43

      坑爹的两点...图竟然是无向图~~输入注意起点和终点时一个点的情况...


Program:

#include<iostream>#include<queue>#include<string.h>#include<map>#define oo 2000000000#define ll long longusing namespace std; struct node{      int x,y,w,next;}line[20005];int  _link[2005],dp[2005],i,n,m,ss,ee;bool inqueue[2005];queue<int> myqueue;map<string,int> mymap;string s;char str[35];int SPFA(){      int i,h,k;      while (!myqueue.empty()) myqueue.pop();      memset(inqueue,false,sizeof(inqueue));      memset(dp,-1,sizeof(dp));      dp[ss]=0;      myqueue.push(ss);      while (!myqueue.empty())      {            h=myqueue.front();            myqueue.pop();            inqueue[h]=false;            k=_link[h];            while (k)            {                  if (dp[line[k].y]==-1 || dp[line[k].y]>dp[h]+line[k].w)                  {                         dp[line[k].y]=dp[h]+line[k].w;                         if (!inqueue[line[k].y])                         {                                inqueue[line[k].y]=true;                                myqueue.push(line[k].y);                         }                  }                  k=line[k].next;            }      }      return dp[ee];}int main(){       while (~scanf("%d",&m))      {              if (m==-1) break;             mymap.clear();             scanf("%s",str); s=str;             mymap[s]=1;             scanf("%s",str); s=str;             n=1;             if (mymap.find(s)==mymap.end())             {                    n++;                    mymap[s]=n;                    ee=2;             }else ee=1;             ss=1;             memset(_link,0,sizeof(_link));             for (i=1;i<=m;i++)             {                    scanf("%s",str); s=str;                    if (mymap.find(s)==mymap.end())                     {                           n++;                              mymap[s]=n;                           line[i*2-1].x=n;                           }else line[i*2-1].x=mymap[s];                    scanf("%s",str); s=str;                    if (mymap.find(s)==mymap.end())                     {                           n++;                              mymap[s]=n;                           line[i*2-1].y=n;                           }else line[i*2-1].y=mymap[s];                    scanf("%d",&line[i*2-1].w);                    line[i*2-1].next=_link[line[i*2-1].x];                    _link[line[i*2-1].x]=i*2-1;                    line[i*2].x=line[i*2-1].y;                    line[i*2].y=line[i*2-1].x;                    line[i*2].w=line[i*2-1].w;                    line[i*2].next=_link[line[i*2].x];                    _link[line[i*2].x]=i*2;             }             printf("%d\n",SPFA());      }       return 0;   }



原创粉丝点击