HDU Tody HDU2112

不想用floyd了 也不一定适合  floyd只能处理小数据

dijkstra算法

wa了很久   一个是dijkstra里面的u   导致RE了无数次   下标溢出

还有就是注意细节  当起点和终点是一个地方的时候  输出0

#include<iostream>
#include<map>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
#define INF 99999999
int m1[155][155];
map<string,long long>ma;
int dis[155];
int vis[155];int c;

void di()
{   memset(vis,0,sizeof(vis));
    for(int i=1;i<=c;i++)
         dis[i]=m1[1][i];
    vis[1]=1;
    for(int i=0;i<c-1;i++)
    {
        int minn=INF;
        int u;
        for(int j=1;j<=c;j++)
        {
            if(vis[j]==0&&dis[j]<minn)
            {
                u=j;
                minn=dis[j];

            }

        }
        vis[u]=1;
        for(int j=1;j<=c;j++)
        {
            if(vis[j]==0&&dis[u]+m1[u][j]<dis[j])
            {
                dis[j]=dis[u]+m1[u][j];
            }

        }


    }



}



int main()
{
 int n;

 while(scanf("%d",&n)==1&&n!=-1)
 {    c=0;
      ma.clear();
     string s1,s2;
    int ok=1;
     cin>>s1>>s2;if(s1==s2){ok=0;}
     ma[s1]=++c;
     ma[s2]=++c;
     int time1;

     for(int i=0;i<=153;i++)
        for(int j=0;j<=153;j++)
     {
         if(i==j)m1[i][j]=0;
         else m1[i][j]=INF;

     }

     while(n--)
     {
         cin>>s1>>s2>>time1;
         if(ma[s1]==0)ma[s1]=++c;
         if(ma[s2]==0)ma[s2]=++c;
         if(time1<m1[ ma[s1] ][ ma[s2]  ])
         {
             m1[ ma[s1] ][ ma[s2]  ]=m1[ ma[s2] ][ ma[s1] ]=time1;

         }

     }


     di();

  if(!ok)printf("0\n");
   else {
     if(dis[2]!=INF)
     printf("%d\n",dis[2]);
     else
        printf("-1\n");
   }



 }



return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/bxd123/p/10326388.html