zoukankan      html  css  js  c++  java
  • POJ 3259Wormholes

    题意:名字很高端的题,虫洞,给定两点直接进行跳跃,问能否回到从某点出发之前的时间,也就是说构成一个回路,形成负环即可,所以说能否构成负环就成为这题的解法,也就是判断负环;

    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<set>
    #include<stack>
    #include<queue>
    #include<cstring>
    #include<cstdio>
    #define INF 0x3f3f3f3f
    using namespace std;
    int vulue[505][505];
    int dis[505];bool vis[505];int ci[505];
    int main(){
    	int f;
    	scanf("%d",&f);
    	for(int i=1;i<=f;i++){
    		int n,m,w;
    		memset(vulue,INF,sizeof(vulue));
    		scanf("%d %d %d",&n,&m,&w);
    		int a,b,c;
    		for(int i=1;i<=m;i++){
    			scanf("%d %d %d",&a,&b,&c);
    			if(vulue[a][b]!=INF){
    				vulue[a][b]=min(vulue[a][b],c);
    				vulue[b][a]=min(vulue[b][a],c);
    			}
    			else{
    				vulue[a][b]=c;
    				vulue[b][a]=c;
    			}
    		}
    		for(int i=1;i<=w;i++){
    			scanf("%d %d %d",&a,&b,&c);
    			vulue[a][b]=(-c);
    		}
    		memset(vis,0,sizeof(vis));
    		memset(dis,INF,sizeof(dis));
    		memset(ci,0,sizeof(ci));
    		queue<int>que;
    		que.push(1);
    		dis[1]=0;
    		ci[1]++;
    		vis[1]=1;
    		int flag=0;
    		while(!que.empty()){
    			int u=que.front();
    			que.pop();
    			vis[u]=0;
    		//	cout<<u<<endl;
    			for(int j=1;j<=n;j++){
    				if(dis[j]>dis[u]+vulue[u][j]){
    					dis[j]=dis[u]+vulue[u][j];
    					if(vis[j]==0){
    						vis[j]=1;
    						ci[j]++;
    						que.push(j);
    						if(ci[j]>n){
    							flag=1;
    							break;
    						}
    					}
    				}
    			}
    			if(flag==1){
    				break;
    			}
    		}
    		if(flag==1)  printf("YES
    ");
    		else printf("NO
    ");
    	}
    	return 0;
    }


  • 相关阅读:
    通过 Web 服务共享 Windows 剪贴板
    bzoj 1007[HNOI2008]水平可见直线 半平面交
    c#读写INI
    c#获得伪静态页码
    c#判断部分
    c#网络通信
    C# 转换函数
    c#文件操作
    c#进制转换
    服务器端异步接受SOKCET请求
  • 原文地址:https://www.cnblogs.com/wang9897/p/7624394.html
Copyright © 2011-2022 走看看