My code is getting correct ans for all inputs in this forum but still WA. Please anybody help...
Code: Select all
#include<bits/stdc++.h>
#define sc(x) scanf("%d",&x)
#define sc2(x,y) scanf("%d%d",&x,&y)
#define sc3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define sc4(w,x,y,z) scanf("%d%d%d%d",&w,&x,&y,&z)
#define pr(x) printf("%d",x)
#define pr2(x,y) printf("%d %d",x,y)
#define pr3(x,y,z) printf("%d %d %d",x,y,z)
#define pr4(w,x,y,z) printf("%d %d %d %d",w,x,y,z)
#define prn(x) printf("%d\n",x)
#define prn2(x,y) printf("%d %d\n",x,y)
#define prn3(x,y,z) printf("%d %d %d\n",x,y,z)
#define prn4(w,x,y,z) printf("%d %d %d %d\n",w,x,y,z)
#define memc(x,y) memcpy(&x,&y,sizeof(x))
#define mems(x,y) memset(x,y,sizeof(x))
#define fli() freopen("in.txt","r",stdin)
#define flo() freopen("out.txt","w",stdout)
#define Rep(i,x,v) for(int i=x;i<v;i++)
#define Repe(i,x,v) for(int i=x;i<=v;i++)
#define rep(i,v) for(int i=0;i<v;i++)
#define repe(i,v) for(int i=0;i<=v;i++)
#define Repr(i,x,v) for(int i=x;v<i;i--)
#define Repre(i,x,v) for(int i=x;v<=i;i--)
#define repr(i,x) for(int i=x;0<i;i--)
#define repre(i,x) for(int i=x;0<=i;i--)
#define repv(i,x) for(auto i=x.begin();i!=x.end();i++)
#define reprv(i,x) for(auto i=x.rbegin();i!=x.rend();i++)
#define Repn(i,x,v) for(int i=x;i<v;i++,putchar('\n'))
#define repn(i,v) for(int i=0;i<v;i++,putchar('\n'))
#define bl putchar('\n')
#define PI acos(-1)
#define ign cin.ignore(100,'\n')
#define gcc getchar()
#define pcc putchar
#define si size
#define fi first
#define se second
#define pf push_front
#define pof pop_front
#define pb push_back
#define pbb pop_back
#define mk make_pair
#define ll long long
#define ull unsigned long long
#define flerr 0.00000001
#define oo (ll)9e18
#define inf INT_MAX
#define maxintarrsize 536870911
#define MAX 505
using namespace std;
int nodes,edges,w,ed[MAX][MAX],aa,bb;
double ans;
struct edge { int to; int length; };
vector<edge>graph[MAX];
vector<int>x,y;
ll min_distance[MAX];
void dijkstra(int source) {
int where;
fill_n(min_distance,MAX,LLONG_MAX);
set< pair<long long,int> > active_vertices;
min_distance[ source ] = 0;
active_vertices.insert( {0,source} );
while (!active_vertices.empty()) {
where = active_vertices.begin()->second;
active_vertices.erase( active_vertices.begin() );
for (auto edge : graph[where]){
if (min_distance[edge.to] > min_distance[where] + edge.length) {
active_vertices.erase( { min_distance[edge.to], edge.to } );
min_distance[edge.to] = min_distance[where] + edge.length;
active_vertices.insert( { min_distance[edge.to], edge.to } );
}
}
}
}
int main(){
// fli();
int u,v,ss,c=1;
double tmp;
ll d1,d2,dd;
edge tt;
bool flag;
while(sc2(nodes,edges)==2,nodes or edges){
printf("System #%d\n",c++);
if(edges==0){
printf("The last domino falls after 0.0 seconds, at key domino 1.\n\n");
continue;
}
rep(i,edges){
sc3(u,v,w);
x.pb(u);
y.pb(v);
ed[u][v]=w;
ed[v][u]=w;
tt.to=v;tt.length=w;
graph[u].pb(tt);
tt.to=u;
graph[v].pb(tt);
}
dijkstra(1);
ans=0;
ss=x.si();
rep(i,ss){
u=x[i];
v=y[i];
d1=min_distance[x[i]];
d2=min_distance[y[i]];
if(d1==LLONG_MAX or d2==LLONG_MAX) continue;
if(d2>d1) swap(d1,d2),swap(u,v);
dd=d1-d2;
if(dd==ed[u][v]){
if(dd*1.0>ans or (dd*1.0==ans and flag==false) or (dd*1.0==ans and flag==true and u<aa)){
ans=dd;
aa=u;
flag=true;
}
}
else if(dd<ed[u][v]){
tmp=d1 + ( (ed[u][v]-(d1-d2))/2.0 );
if(tmp>ans){
ans=tmp;
aa=u;
bb=v;
if(aa>bb) swap(aa,bb);
flag=false;
}
else if(tmp==ans and flag==false){
if(u>v) swap(u,v);
if(u<aa){
ans=tmp;
aa=u;
bb=v;
flag=false;
}
}
}
}
if(flag){
printf("The last domino falls after %.1f seconds, at key domino %d.\n\n",ans,aa);
}
else{
printf("The last domino falls after %.1f seconds, between key dominoes %d and %d.\n\n",ans,aa,bb);
}
Repe(i,1,nodes) graph[i].clear();
x.clear();
y.clear();
}
return 0;
}