| |||
描述 Description | |||
给出一有向图,图中每条边都被标上了关系运算符‘<’,‘>’,‘=’。现在要给图中每个顶点标上一个大于等于0,小于等于k的某个整数使所有边上的符号得到满足。若存在这样的k,则求最小的k,若任何k都无法满足则输出NO。 例如下表中最小的k为2。 结点1>结点2 结点2>结点3 结点2>结点4 结点3=结点4 如果存在这样的k,输出最小的k值;否则输出‘NO’。 | |||
输入格式 Input Format | |||
共二行,第一行有二个空格隔开的整数n和m。n表示G的结点个数,m表示G的边数,其中1<=n<=1000, 0<=m<=10000。全部结点用1到n标出,图中任何二点之间最多只有一条边,且不存在自环。 第二行共有3m个用空格隔开的整数,第3i-2和第3i-1(1<=i<=m)个数表示第i条边的顶点。第3i个数表示第i条边上的符号,其值用集合{-1,0,1}中的数表示:-1表示‘<’, 0 表示‘=’, 1表示‘>’。 | |||
输出格式 Output Format | |||
仅一行,如无解则输出‘NO’;否则输出最小的k的值。 | |||
样例输入 Sample Input [复制数据] | |||
样例输出 Sample Output [复制数据] | |||
时间限制 Time Limitation | |||
各个测试点1s | |||
水题。但是一开始忘了输出NO,所以多交了一次。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
bool used[1010];
long dist[1010];
long que[1010000];
const long qmod = 1000000;
struct node
{
long ind;
long val;
node* nxt;
};
node* head[1010];
long cnt[1010];
long n;
inline long getint()
{
long rs=0;bool sgn=1;char tmp;
do tmp = getchar();
while (!isdigit(tmp)&&tmp-'-');
if (tmp == '-'){tmp=getchar();sgn=0;}
do rs=(rs<<3)+(rs<<1)+tmp-'0';
while (isdigit(tmp=getchar()));
return sgn?rs:-rs;
}
void spfa()
{
memset(dist,~0x3f,sizeof dist);
dist[n] = 0;
long l = 0;
long r = 0;
r ++;
que[r] = n;
while (l != r)
{
l ++;
if (l == qmod)
l = 0;
long u = que[l];
used[u] = false;
for (node* vv=head[u];vv;vv=vv->nxt)
{
long v = vv->ind;
if (dist[v] < dist[u]+vv->val)
{
cnt[v] ++;
if (cnt[v] >= n)
{
printf("NO");
exit(0);
}
dist[v] = dist[u] + vv->val;
if (!used[v])
{
used[v] = true;
r ++;
if (r == qmod)
r = 0;
que[r] = v;
}
}
}
}
}
void insert(long a,long b,long c)
{
node* nn = new node;
nn -> ind = b;
nn -> nxt = head[a];
nn -> val = c;
head[a] = nn;
}
int main()
{
freopen("relation.in","r",stdin);
freopen("relation.out","w",stdout);
n = getint();
long m = getint();
for (long i=1;i<m+1;i++)
{
long u = getint();
long v = getint();
long c = getint();
if (c == 1)
{
insert(u,v,1);
}
else if (c == -1)
{
insert(v,u,1);
}
else
{
insert(v,u,0);
}
}
n ++;
for (long i=1;i<n;i++)
{
insert(n,i,0);
}
spfa();
long ans = 0;
for (long i=1;i<n+1;i++)
{
ans = ans>dist[i]?ans:dist[i];
}
printf("%ld",ans);
return 0;
}