Meeting HDU

来源:互联网 发布:输电网络 编辑:程序博客网 时间:2024/06/08 02:12

给许多个组,每个组内点可以花相同时间互相抵达,

可以通过加虚拟点,入边t,出边0来完成建图

其他就是比较恶心的输出以及一个微妙的特判了,具体可以看代码最后的部分,

debug良久猜了一个n=2的hack,加上这个就pe了,难以描述

//#include<bits/stdc++.h>  //#pragma comment(linker, "/STACK:1024000000,1024000000")   #include<stdio.h>  #include<algorithm>  #include<queue>  #include<string.h>  #include<iostream>  #include<math.h>  #include<set>  #include<map>  #include<vector>  #include<iomanip>  using namespace std;    const double pi=acos(-1.0);  #define ll long long  #define pb push_back#define sqr(a) ((a)*(a))#define dis(a,b) sqrt(sqr(a.x-b.x)+sqr(a.y-b.y))#define FOR(a) for(int i=1;i<=a;i++)const double eps=1e-10;const int maxn=2e5+56;const int inf=0x3f3f3f3f;int n,m;     struct EDGE{int v;ll w;};  vector<EDGE>G[maxn];  void addedge(int u,int v,int w){      G[u].pb((EDGE){v,1ll*w});   }  struct NODE{      int v;ll d;      friend bool operator<(NODE a,NODE b){return a.d>b.d;}  };  ll d[maxn][2],vis[maxn];  void dij(int from,int to,int tic){  memset(vis,0,sizeof vis);    for(int i=0;i<maxn;i++)d[i][tic]=9e18;      d[from][tic]=0;      priority_queue<NODE>Q;      NODE now=(NODE){from,0};      Q.push(now);      while(!Q.empty()){          NODE now=Q.top();Q.pop();          int u=now.v;          if(vis[u])continue;          vis[u]=1;          for(int i=0;i<G[u].size();i++){              if(d[G[u][i].v][tic]>d[u][tic]+G[u][i].w){                  d[G[u][i].v][tic]=d[u][tic]+G[u][i].w;                  NODE nxt=(NODE){G[u][i].v,d[G[u][i].v][tic]};                  Q.push(nxt);              }          }      }  } int main(){int T;scanf("%d",&T);int kase=0;while(T--){printf("Case #%d: ",++kase);scanf("%d%d",&n,&m);for(int i=1;i<=n+m;i++)G[i].clear();for(int i=1;i<=m;i++){int t,cnt;scanf("%d%d",&t,&cnt);for(int j=1;j<=cnt;j++){int x;scanf("%d",&x);addedge(x,n+i,t);addedge(n+i,x,0);}}dij(1,n,0);dij(n,1,1);ll ans=9e18;for(int i=2;i<n;i++){ans=min(ans,max(d[i][0],d[i][1]));}if(ans==9e18){puts("Evil John");continue;}else{printf("%lld\n",ans);int block=0;if(ans==d[1][1]){printf("1");block=1;}for(int i=2;i<n;i++){if(ans==max(d[i][0],d[i][1])){if(block)printf(" %d",i);else{printf("%d",i);block=1;}}}if(ans==d[n][0]){if(block)printf(" %d",n);else printf("%d",n);}puts("");}}}


原创粉丝点击