记录编号 291124 评测结果 AAAAAAAAAA
题目名称 [WC 2010模拟] 奶牛排队 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.056 s
提交时间 2016-08-07 10:46:28 内存使用 34.63 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<deque>
#define INF 0x7ffffff
using namespace std;
const int maxn=1010,maxm=3000100;//因为边有三种:cp,冤家,相邻
int Bellman_Ford(int,int);
int s[maxm],t[maxm],d[maxm];
int len=0;
int n,p,k,m=0,x,y,z,dis[maxn],cnt[maxn]={0};
int main(){
	freopen("layout.in","r",stdin);
	freopen("layout.out","w",stdout);
	scanf("%d%d%d",&n,&p,&k);
	while(p--){
		scanf("%d%d%d",&x,&y,&z);//cp
		if(x>y)swap(x,y);
		s[++m]=x;t[m]=y;d[m]=z;
	}
	while(k--){
		scanf("%d%d%d",&x,&y,&z);
		if(x<y)swap(x,y);
		s[++m]=x;t[m]=y;d[m]=-z;
	}
	for(int i=1;i<n;i++){
		s[++m]=i+1;t[m]=i;d[m]=0;
	}
	printf("%d",Bellman_Ford(1,n));
	fclose(stdin);
	fclose(stdout);
	return 0;
}
int Bellman_Ford(int x,int to){
	memset(dis,63,sizeof(dis));
	dis[x]=0;
	for(int k=1;k<n;k++)for(int i=1;i<=m;i++)
		dis[t[i]]=min(dis[t[i]],dis[s[i]]+d[i]);
	if(dis[to]>=0x7ffffff)return -2;
	for(int i=1;i<=m;i++)if(dis[t[i]]>dis[s[i]]+d[i])return -1;
	return dis[to];
}