POJ3169 Layout

题目链接

#include<cstdio>
#include<cstring>
#define MAXN 1005
#define MAXM 10005
using namespace std;

struct edge{
	int v,w,next;
	edge():next(0){}
}G[MAXM];

int head[MAXN]={0};
long long dis[MAXN];
int N,ML,MD,a,b,d;
int tot = 0;
inline void add(int u,int v,int w){
	G[++tot].v=v;G[tot].w=w;G[tot].next=head[u];head[u]=tot; 
}

int vis[MAXN]={0};
int C[MAXN];
int q[MAXN*MAXN];



int main(){
	
	memset(vis,0,sizeof(vis));  
        memset(C,0,sizeof(C));
	
	scanf("%d%d%d",&N,&ML,&MD);
	for(register int i=1;i<=ML;++i){
		scanf("%d%d%d",&a,&b,&d);
		add(a,b,d);
	}
	for(register int i=1;i<=MD;++i){
		scanf("%d%d%d",&a,&b,&d);
		add(b,a,-d);
	}
	for(register int i=1;i<=N;++i){
		dis[i]=2147483647;
	}
	
	q[1]=1;
	vis[1]=1;C[1]=1;
	dis[1]=0;
	int l = 1;int r = 1;
	int cnt = 1;
	
	while(l<=r){
		cnt = 0;
		for(register int i=l;i<=r;++i){
			int u = q[i];
			for(register int j=head[u];j;j=G[j].next){
				int v = G[j].v;int w = G[j].w;
				if(dis[v]>dis[u]+w){
					dis[v]=dis[u]+w;
					C[v]++;
					if(C[v]>N){
						puts("-1");
						return 0;
					}
					if(vis[v]==0){
						vis[v]=1;
						q[(++cnt)+r]=v;
					}
				}
			}
			vis[u]=0;
		}
		l=r+1;r+=cnt;
	}
	
	
	if(dis[N]==2147483647)puts("-2");
	else printf("%lld",dis[N]);
	return 0;
}
posted @ 2018-03-04 22:01  Neworld1111  阅读(106)  评论(0编辑  收藏  举报