zoukankan      html  css  js  c++  java
  • POJ--3529--Wormholes

    Wormholes
    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 36889   Accepted: 13520

    Description

    While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wormhole! Each of FJ's farms comprises N (1 ≤ N ≤ 500) fields conveniently numbered 1..NM (1 ≤ M ≤ 2500) paths, and W (1 ≤ W ≤ 200) wormholes.

    As FJ is an avid time-traveling fan, he wants to do the following: start at some field, travel through some paths and wormholes, and return to the starting field a time before his initial departure. Perhaps he will be able to meet himself :) .

    To help FJ find out whether this is possible or not, he will supply you with complete maps to F (1 ≤ F ≤ 5) of his farms. No paths will take longer than 10,000 seconds to travel and no wormhole can bring FJ back in time by more than 10,000 seconds.

    Input

    Line 1: A single integer, FF farm descriptions follow. 
    Line 1 of each farm: Three space-separated integers respectively: NM, and W 
    Lines 2..M+1 of each farm: Three space-separated numbers (SET) that describe, respectively: a bidirectional path between S and E that requires T seconds to traverse. Two fields might be connected by more than one path. 
    Lines M+2..M+W+1 of each farm: Three space-separated numbers (SET) that describe, respectively: A one way path from S to E that also moves the traveler back T seconds.

    Output

    Lines 1..F: For each farm, output "YES" if FJ can achieve his goal, otherwise output "NO" (do not include the quotes).

    Sample Input

    2
    3 3 1
    1 2 2
    1 3 4
    2 3 1
    3 1 3
    3 2 1
    1 2 3
    2 3 4
    3 1 8

    Sample Output

    NO
    YES

    题意:就是给N组測试数据,给你N个点M条无向边,再给你W个虫洞(能够使时间倒流)。问你能不能看到刚出发时的自己。(就是推断存不存在负环)。

    思路:套上SPFA公式然后推断负环就能够了。

    #include<stdio.h>//好坑,wa了半天没过去,竟然是由于大写和小写问题。整个人都不好了。 
    #include<string.h>
    #include<queue>
    #define INF 0x3f3f3f3f
    #define M 3000*2
    #define N 550
    using namespace std;
    int n,m,w,dis[N],vis[N],used[N],head[N],edgenum;
    struct node{
    	int from,to,cost,next;
    }edge[M];
    void init(){
    	edgenum=0;
    	memset(head,-1,sizeof(head));
    }
    void add(int u,int v,int cost){
    	node E={u,v,cost,head[u]};
    	edge[edgenum]=E;
    	head[u]=edgenum++;
    }
    void spfa(){
    	queue<int>q;
    	memset(vis,0,sizeof(vis));
    	memset(dis,INF,sizeof(dis));
    	memset(used,0,sizeof(used));
    	dis[1]=0;
    	vis[1]=1;
    	q.push(1);
    	used[1]++;
    	while(!q.empty()){
    		int u=q.front();
    		q.pop();
    		vis[u]=0;
    		for(int i=head[u];i!=-1;i=edge[i].next){
    			int v=edge[i].to;
    			if(dis[v]>dis[u]+edge[i].cost){
    				dis[v]=dis[u]+edge[i].cost;
    				if(!vis[v]){
    					vis[v]=1;
    					used[v]++;
    					if(used[v]>n){
    						printf("YES
    ");//存在负环就意味着时光能够倒流。 
    						return ;
    					}
    					q.push(v);
    				}
    			}
    		}
    	}
    	printf("NO
    ");
    }
    int main(){
    	int T;
    	scanf("%d",&T);
    	while(T--){
    		scanf("%d%d%d",&n,&m,&w);
    		init();
    		while(m--){
    			int a,b,cost;
    			scanf("%d%d%d",&a,&b,&cost);//加入无向边。 
    			add(a,b,cost);
    			add(b,a,cost);
    		}
    		while(w--){
    			int a,b,cost;//加入单向虫洞。

    scanf("%d%d%d",&a,&b,&cost); cost=-cost; add(a,b,cost); } spfa(); } return 0; }


    ac代码:

  • 相关阅读:
    383. Ransom Note
    598. Range Addition II
    453. Minimum Moves to Equal Array Elements
    492. Construct the Rectangle
    171. Excel Sheet Column Number
    697. Degree of an Array
    665. Nondecreasing Array
    视频网站使用H265编码能提高视频清晰度吗?
    现阶段的语音视频通话SDK需要解决哪些问题?
    企业远程高清会议平台视频会议系统在手机端使用的必备要求有哪些?
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7279712.html
Copyright © 2011-2022 走看看