poj1135最短路

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <climits>

#include <string>

#include <iostream>

#include <map>

#include <cstdlib>

#include <list>

#include <set>

#include <queue>

#include <stack>



using namespace std;



int n,m;

const int maxn=505;

struct Node

{

    int x;int val;

}node[maxn];

struct cmp

{

    bool operator ()(const Node &a,const Node &b)

    {

        return a.val<b.val;

    }

};

const int INF=10000000;

int dis[maxn];

int vis[maxn];

int Map[maxn][maxn];

void djs(int x)

{

    for(int i=1;i<=n;i++){

        dis[i]=INF;vis[i]=0;

    }

    dis[x]=0;vis[x]=1;

    Node k; k.x=x;k.val=0;

    priority_queue<Node,vector<Node> ,cmp> q;

    q.push(k);

    while(!q.empty()){

        Node k=q.top();q.pop(); int cur=k.x;vis[x]=1;

        for(int i=1;i<=n;i++){

            if(dis[i]>dis[cur]+Map[cur][i]){

                dis[i]=dis[cur]+Map[cur][i];

                if(!vis[i]){

                    Node k; k.x=i;k.val=dis[i];

                    q.push(k);

                }

            }

        }

    }

}

int main()

{

    int ret=0;

    while(cin>>n>>m,++ret&&n||m){

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

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

            Map[i][j]=INF;

        for(int i=0;i<m;i++){

            int a,b,c;cin>>a>>b>>c;

            if(Map[a][b]>c) Map[a][b]=Map[b][a]=c;

        }

        djs(1);

        double ans=0;int sign=1;

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

        if(dis[i]>ans){

            ans=dis[i];sign=i;

        }

        double ans1=0;int a;int b;

        for(int i=1;i<=n;i++){

            for(int j=i+1;j<=n;j++)if(Map[i][j]!=INF) {

                double t=(dis[i]+dis[j]+Map[i][j])/2.0;

                if(t>ans1) {

                    ans1=t; a=i;b=j;

                }

            }

        }

      //  for(int i=1;i<=n;i++)

          //  cout<<dis[i]<<endl;

        if(ret!=1) cout<<endl;

        printf("System #%d\n",ret);

        if(ans1>ans){

            printf("The last domino falls after %.1f seconds, between key dominoes %d and %d.\n",ans1,a,b);

        }

        else{

            printf("The last domino falls after %.1f seconds, at key domino %d.\n",ans,sign);

        }

    }

    return 0;

}

你可能感兴趣的:(poj)