标签:des style color os io strong for ar art
解题报告
题目传送门
思路:
简单的差分约束
求解max
n-1<=max
以1为起点,n为终点跑一下最短路就可以了,求出的dis[n]就是答案
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define N 5000
#define M 50000
#define inf 0x3f3f3f3f
using namespace std;
struct node
{
int v,w,next,cost,cap;
}edge[M];
int head[N],vis[N],dis[N],pre[N],l[N],cnt,n,m,s,t,f;
void add(int u,int v,int w)
{
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void spfa()
{
for(int i=1;i<=n;i++)
{
dis[i]=inf;
vis[i]=0;
}
dis[s]=0;
vis[s]=1;
queue<int>Q;
Q.push(s);
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].v;
if(dis[v]>dis[u]+edge[i].w)
{
dis[v]=dis[u]+edge[i].w;
if(!vis[v])
{
l[v]++;
if(l[v]>n)
{
f=1;
break;
}
vis[v]=1;
Q.push(v);
}
}
}
}
}
int main()
{
int i,j,ml,md,a,b,c;
while(~scanf("%d%d%d",&n,&ml,&md))
{
s=1;
t=n;
memset(head,-1,sizeof(head));
cnt=0;
for(i=0;i<ml;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
for(i=0;i<md;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(b,a,-c);
}
spfa();
if(f)
{
printf("-1\n");
}
else if(dis[n]==inf)
{
printf("-2\n");
}
else printf("%d\n",dis[n]);
}
return 0;
}| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 7111 | Accepted: 3417 |
Description
Input
Output
Sample Input
4 2 1 1 3 10 2 4 20 2 3 3
Sample Output
27
Hint
标签:des style color os io strong for ar art
原文地址:http://blog.csdn.net/juncoder/article/details/38780437