记录编号 |
291124 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[WC 2010模拟] 奶牛排队 |
最终得分 |
100 |
用户昵称 |
AntiLeaf |
是否通过 |
通过 |
代码语言 |
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];
}