您的位置:首页 > 其它

关于拓扑排序的问题-P3116 [USACO15JAN]会议时间Meeting Time

2017-02-26 17:51 417 查看
https://www.luogu.org/problem/show?pid=3116

这道题目很水啊,但是我没有1A,而且wa了好多;

题目意思我就不讲了;

反正就是一个拓扑序dp;

但是这道题目规定了起点是1;

所以我一开始直接把1放进队列里然后拓扑;

就哇了;

原因很简单;

除了1以外,还有很多入度为0的点;

(当然1的入度可能不为0,没关系)

如果我直接从1遍历;

就会导致有些点的入度永远不为0;

所以我们要先吧把的入度==0的非1点先跑一遍拓扑;

跑完后,整个图只有1是入度为0的了;

这样再从1开始跑;

#include<cstdio>//cfb
#include<iostream>
#include<cstring>
using namespace std;
struct cs{int to,next,A,B;}a[100001];
int head[101],s[101],q[105];
bool aa[101][20001],bb[101][20001];
int n,m,x,y,z,A,B,ll,l,r;
void init(int x,int y,int A,int B){
ll++;
a[ll].to=y;
a[ll].A=A;
a[ll].B=B;
a[ll].next=head[x];
head[x]=ll;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&x,&y,&A,&B);
init(x,y,A,B);
s[y]++;
}
for(int i=2;i<=n;i++)if(!s[i])q[++r]=i;
while(r>l){
x=q[++l];
for(int k=head[x];k;k=a[k].next){
y=a[k].to;
if(!--s[y])q[++r]=y;
}
}
q[1]=1;
aa[1][0]=bb[1][0]=1;
r=1; l=0;
while(r>l){
x=q[++l];
for(int k=head[x];k;k=a[k].next){
y=a[k].to;
s[y]--;
if(!s[y])q[++r]=y;
for(int i=0;i<=10000;i++){
if(aa[x][i])aa[y][i+a[k].A]=1;
if(bb[x][i])bb[y][i+a[k].B]=1;
}
}
}
for(int i=0;i<=10000;i++)if(aa
[i]&&bb
[i]){
printf("%d",i);return 0;
}
printf("IMPOSSIBLE");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: