zoukankan      html  css  js  c++  java
  • Meeting HDU

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

    可以通过加虚拟点,入边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
    ",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("");
    		}
    	}
    }


  • 相关阅读:
    数据库内外连接以及自然连接
    Mybatis的一级二级缓存
    彻底弄懂CAS单点登录
    Tomcat部署项目的方式
    redis集群脑裂以及解决方案
    AOP分析--代理方式的选择
    线程池
    数据结构--结构体
    Python程序--选择判断
    C语言--密码问题
  • 原文地址:https://www.cnblogs.com/Drenight/p/8611233.html
Copyright © 2011-2022 走看看