1202: [HNOI2005]狡猾的商人
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1339 Solved: 636
[Submit][Status]
Description
Input
Output
Sample Input
3 3
1 2 10
1 3 -5
3 3 -15
5 3
1 5 100
3 5 50
1 2 51
Sample Output
false
【題解】我們可以這樣想,賬本能夠判定爲假的條件就是,有三段的和,並且最長段可以由另外兩個拼起來,滿足sum[3]!=sum[2]+sum[1];所以我用了一個數組f [ i ][ j ],記錄i 到 j 的和爲多少。然後考慮銜接,我們先將所有段按s 爲第一關鍵字,t 爲第二關鍵字從小到大排序,然後枚舉 j, if(f[ j ][a[i].s-1]!=初值) 存在可以銜接的對象,在判斷 if(f [ i ][ a[i].t ]==初值)則直接賦值,否則判斷是否相等,不等則說明是假的。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{int s,t,sum;}a[1000];
int f[100][100];
inline bool cmp(node x,node y)
{
if(x.s<y.s)return 1;
else if(x.s>y.s)return 0;
else return x.t<y.t;
}
int main()
{
int w,inf,n,m;scanf("%d",&w);
while(w--){
memset(f,0x7f,sizeof(f));
inf=f[1][1];
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)scanf("%d%d%d",&a[i].s,&a[i].t,&a[i].sum);
sort(a+1,a+1+m,cmp);
bool key=0;
for(int i=1;i<=m;i++)
{
if(f[a[i].s][a[i].t]==inf)f[a[i].s][a[i].t]=a[i].sum;
else if(f[a[i].s][a[i].t]!=a[i].sum){key=1;break;}
for(int j=1;j<=a[i].s-1;j++)
if(f[j][a[i].s-1]!=inf)
if(f[j][a[i].t]==inf)f[j][a[i].t]=f[j][a[i].s-1]+a[i].sum;
else if(f[j][a[i].t]!=f[j][a[i].s-1]+a[i].sum)key=1;
if(key)break;
}
if(key)printf("false\n");
else printf("true\n");
}
return 0;
}