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;
}
浙公网安备 33010602011771号