hdu 1874 通畅工程续

http://acm.hdu.edu.cn/showproblem.php?pid=1874

很水

#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<ctime>

#include<queue>

#include<map>

#include<cstring>

#include<algorithm>

#define LL long long

using namespace std;



const int N=205;

const int MAX=0x5fffffff;

int side[N][N];//边最大代表 没有连接 否则代表两点之间距离

int dist[N];//到出发点的距离

bool in[N];//是否已经最终更新 true 为已经最终更新   false 代表尚未最终更新

int main()

{



   //freopen("data.txt","r",stdin);

   int n,m;

   while(scanf("%d %d",&n,&m)!=EOF)

   {

       for(int i=0;i<n;++i)

       for(int j=0;j<n;++j)

       side[i][j]=MAX;//初始化

       while(m--)

       {

           int i,j,d;

           cin>>i>>j>>d;

           if(d<side[i][j])//为了防止有重边

           {

               side[i][j]=side[j][i]=d;

           }

       }

       int S,T;

       cin>>S>>T;

       if(S==T)//特殊情况

       {

           cout<<"0"<<endl;

           continue;

       }

       for(int i=0;i<n;++i)

       dist[i]=side[S][i];//初始化各点到 出发点的距离

       memset(in,false,sizeof(in));

       in[S]=true;//标记 出发点已经更新

       for(int w=1;w<n;++w)//最多 n-1 次查询

       {

            int M=MAX,k=-1;

            for(int i=0;i<n;++i)

            {

                if(in[i]==false&&dist[i]<M)//每次找还未被最终更新的点中  到出发点最短的点

                {

                    M=dist[i];

                    k=i;

                }

            }

            if(k==-1)//如果没找到 跳出循环

            break;

            if(k==T)//如果这个点就是终点 无需在继续寻找

            break;

            in[k]=true;

            for(int i=0;i<n;++i)

            {

                if(in[i]==false)

                {

                    if(dist[i]>dist[k]+side[k][i])//用目前最短的点去更新其它剩余的点

                    {

                        dist[i]=dist[k]+side[k][i];

                    }

                }

            }

       }

       if(dist[T]==MAX)

       cout<<"-1"<<endl;

       else

       cout<<dist[T]<<endl;

   }

   return 0;

}

 

你可能感兴趣的:(HDU)