poj 1135

代码:

#include<iostream>
#include<fstream>
#include<queue>

using namespace std;

struct e{
    int data;
    int cost;
    e *next;
};

e edge[501];

int n,m;

void add(int s,int t,int w){
    e *p=new e;
    p->data=s;
    p->cost=w;
    p->next=edge[t].next;
    edge[t].next=p;

    e *q=new e;
    q->data=t;
    q->cost=w;
    q->next=edge[s].next;
    edge[s].next=q;
}

int d[501];
int v[501];

struct b{
    int w;
    int data;
    friend bool operator<(b s,b t){
        return s.w>t.w;
    }
};

void dis(){
    int i,j,k;
    priority_queue<b> q;
    for(i=2;i<=n;i++)
        d[i]=10000000;
    memset(v,0,sizeof(v));
    d[1]=0;
    b a;
    a.data=1;
    a.w=0;
    q.push(a);

    while(!q.empty())
    {
        a=q.top();
        q.pop();
        if(v[a.data])
            continue;
        v[a.data]=1;
        e *p=edge[a.data].next;
        while(p){
            j=p->data;
            if(d[j]>a.w+p->cost)
            {
                d[j]=a.w+p->cost;
                b s;
                s.data=j;
                s.w=d[j];
                q.push(s);
            }
            p=p->next;
        }
    }
}

int cas;

void solve(){
    int i,j=0;
    double k;
    int s=1,t;
    k=0;
    for(i=2;i<=n;i++)
    {
        if(k<d[i])
        {
            k=d[i];
            s=i;
        }
    }
   
    for(i=1;i<=n;i++)
    {
        e *p=edge[i].next;
        while(p)
        {
            if(abs(d[i]-d[p->data])<p->cost)
            {
                if(k<(d[p->data]+d[i]+(double)p->cost)/2)
                {
                    k=(d[p->data]+d[i]+(double)p->cost)/2;
                    j=1;
                    s=min(i,p->data);
                    t=max(i,p->data);
                }
            }
            p=p->next;
        }
    }
    printf("System #%d\n",cas);
    if(j==0)
        printf("The last domino falls after %.1lf seconds, at key domino %d.\n",k,s);
    else
        printf("The last domino falls after %.1lf seconds, between key dominoes %d and %d.\n",k,s,t);
    cout<<endl;

}

void read(){
//    ifstream cin("in.txt");
    int i,j,k,s,t,w;
    while(cin>>n>>m)
    {
        cas++;
   
        if(n==0&&m==0) return ;
        for(i=1;i<=n;i++)
            edge[i].next=0;
        for(i=1;i<=m;i++)
        {
            cin>>s>>t>>w;
            add(s,t,w);

        }
        dis();
        solve();
    }
}

int main(){
    read();
    return 0;
}

posted on 2011-05-28 10:51  宇宙吾心  阅读(321)  评论(0)    收藏  举报

导航