待会删

  1 /*B*/
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<queue>
  5 using namespace std;
  6 int head[10010];
  7 int indegree[10010];
  8 int mon[10010];
  9 int num,sum;
 10 struct stu{
 11    int to,next;
 12 }edge[20010];
 13 void inin(){//初始化 
 14     memset(indegree,0,sizeof(indegree)); 
 15     memset(head,-1,sizeof(head));
 16     memset(mon,0,sizeof(mon));
 17     num=sum=0;
 18 }
 19 void add(int a,int b){//添加边 
 20    stu E={b,head[a]};
 21    edge[num]=E;
 22    head[a]=num++;
 23    indegree[b]++;
 24 }
 25 void topo(int n){
 26     int i,j,id,t,ans=0;
 27     queue<int>q;
 28     while(!q.empty()) q.pop();
 29     for(i=1;i<=n;i++){
 30         if(indegree[i]==0){
 31              q.push(i);
 32              mon[i]=888;
 33         }
 34     }
 35     while(!q.empty()){
 36         t=q.front();
 37         q.pop();
 38         indegree[t]=-1;
 39         sum+=mon[t];
 40         ans++;
 41         for(i=head[t];i!=-1;i=edge[i].next){
 42             id=edge[i].to;
 43             if(--indegree[id]==0){
 44                 mon[id]=mon[t]+1;
 45                 q.push(id);
 46             }
 47         }
 48     }
 49     if(ans==n) printf("%d\n",sum);
 50     else printf("-1\n");
 51 }
 52 int main(){
 53     int n,m,i,j,a,b;
 54     while(scanf("%d%d",&n,&m)!=EOF){
 55         inin();
 56         for(i=1;i<=m;i++){
 57            scanf("%d%d",&a,&b);
 58            add(b,a);
 59         }
 60         topo(n);
 61     }
 62     return 0;
 63 }
 64 
 65 /*C*/
 66 /*注意要尽量让1考前,然后是2考前
 67   例如
 68   输入3 1 应该是3 1  2,如果是按普通的正向topu做的就是2 在最前面 即 2  3  
 69 
 70 1.
 71 */
 72 #include <cstdio>
 73 #include <cstring>
 74 #include <queue>
 75 #define maxn 100002
 76 using namespace std;
 77 
 78 int head[maxn], indegree[maxn], ans[maxn];
 79 struct Node{
 80     int to, next;
 81 } map[maxn];
 82 
 83 void topoSort(int n)
 84 {
 85     priority_queue<int> Q;
 86     int i, u, id = 1;
 87     for(i = 1; i <= n; ++i)
 88         if(!indegree[i]) Q.push(i);
 89     while(!Q.empty()){//大的先弹出 
 90         ans[id++] = u = Q.top();
 91          Q.pop();
 92         for(i = head[u]; i != -1; i = map[i].next)
 93             if(!--indegree[map[i].to]) Q.push(map[i].to);        
 94     }    
 95     for(i = n; i >= 1; --i)//逆向输出 
 96         if(i != 1) printf("%d ", ans[i]);
 97         else printf("%d\n", ans[i]);
 98 }
 99 
100 int main()
101 {
102     int t, n, m, a, b, i;
103     scanf("%d", &t);
104     while(t--){
105         memset(indegree, 0, sizeof(indegree));
106         memset(head, -1, sizeof(head));
107         scanf("%d%d", &n, &m);
108         for(i = 0; i < m; ++i){
109             scanf("%d%d", &a, &b);
110             map[i].to = a;
111             map[i].next = head[b];
112             head[b] = i;
113             ++indegree[a];
114         }
115         topoSort(n);
116     }
117     return 0;
118 }
119 
120 /*D*/
121 #include<cstdio>
122 #include<cstring>
123 #include<queue>
124 using namespace std;
125 int head[10010];
126 int per[10010];
127 int indegree[10010];
128 int num;
129 struct stu{
130     int to,next;
131 }edge[20010];
132 struct node{
133     int a;
134     char s[2];
135     int b;
136 }tol[20010];
137 void inin(int n){
138     memset(head,-1,sizeof(head));
139     memset(indegree,0,sizeof(indegree));
140     num=0;
141     for(int i=0;i<=n;i++)
142         per[i]=i;
143 }
144 int find(int x){
145     return per[x]=x==per[x]?x:find(per[x]);
146 }
147 void judge(int x,int y){
148     int fx=find(x);
149     int fy=find(y);
150     if(per[fx]!=per[fy]){
151         per[fx]=fy;
152     }
153 }
154 void add(int a,int b){//添加边 
155    stu E={b,head[a]};
156    edge[num]=E;
157    head[a]=num++;
158    indegree[b]++;
159 }
160 void topo(int n){
161     int i,j,k,l,flag1,flag2,sum;//sum表示独立的点 
162     l=k=flag1=flag2=sum=0;//flag1表示条件不够,flag2表示矛盾 
163     queue<int>q;
164     while(!q.empty()) q.pop();
165     for(i=0;i<n;i++){
166         if(i==per[i]){
167             sum++;
168            if(indegree[i]==0){
169                  q.push(i);
170                 k++;
171            }    
172         } 
173     }    
174     if(k>1) flag1=1;
175     while(!q.empty()){
176         int v=q.front();
177         q.pop();
178         l++;
179         k=0;
180         for(i=head[v];i!=-1;i=edge[i].next){
181             int w=edge[i].to;
182             indegree[w]--;
183             if(indegree[w]==0){
184                 q.push(w);
185                 k++;
186             }
187         }
188         if(k>1){
189             flag1=1;
190         }
191     }
192     if(l!=sum) flag2=1;
193     if(flag1&&flag2){
194         printf("CONFLICT\n");
195     }
196     else if(flag1){
197         printf("UNCERTAIN\n");
198     }
199     else if(flag2){
200         printf("CONFLICT\n");
201     }
202     else{
203         printf("OK\n");
204     }
205     
206 }
207 int main(){
208     int n,m,i,j,a,b;
209     char s[2];
210     while(scanf("%d%d",&n,&m)!=EOF){
211         inin(n);
212         for(i=0;i<m;i++){//为了合并==的元素 
213             scanf("%d%s%d",&tol[i].a,tol[i].s,&tol[i].b);
214             if(tol[i].s[0]=='='){
215                 judge(tol[i].a,tol[i].b);
216             }
217         }
218         for(i=0;i<m;i++){
219             if(tol[i].s[0]=='=') continue;
220             int a=find(tol[i].a);//之后保证全都是祖先元素操作 
221             int b=find(tol[i].b);
222             if(tol[i].s[0]=='>'){
223                 add(a,b);
224             }
225             else{
226                 add(b,a);
227             }
228         }
229         topo(n);
230     }
231     return 0;
232 }
233 
234 
235 /*E*/
236 #include<cstdio>  
237 #include<cstring>  
238 #include<iostream>  
239 using namespace std;  
240 int map[15][15];  
241 int indegree[12];  
242 int dir[4][2]= {0,0, 1,0, 0,1, 1,1}; //方向数组 
243 int local[10][2]= {-1,-1, 0,0, 0,1, 0,2, 1,0, 1,1, 1,2, 2,0, 2,1, 2,2};  
244 
245 //  1~9号窗口的固定位置  
246 int screen[5][5];  
247 void inin(){
248     memset(map,0,sizeof(map));  
249     memset(indegree,0,sizeof(indegree));  
250 }
251 int topo()  
252 {  
253     int i,j,id,flag;  
254     for(i=1; i<=9; i++)  
255     {  
256         flag=0;  
257         for(j=1; j<=9; j++)  
258             if(indegree[j]==0)  
259             {  
260                 flag=1;  
261                 id=j;  
262                 break;  
263             }  
264         if(flag==0)  
265             return 0;  
266         indegree[id]=-1;  
267         for(j=1; j<=9; j++)  
268             if(map[id][j])  
269                 indegree[j]--;  
270     }  
271     return 1;  
272 }  
273 int main()  
274 {  
275     char s[15];  
276     int i,j,k;  
277     int x,y,z;  
278     while(scanf("%s",s)&&strcmp(s,"ENDOFINPUT")!=0)  
279     {  
280         inin(); 
281         for(i=0; i<4; i++)  
282             for(j=0; j<4; j++)  
283                 scanf("%d",&screen[i][j]);  
284          scanf("%s",s);  
285          for(k=1; k<=9; k++)  
286          {  
287             for(i=0; i<4; i++)  
288             {  
289                 x=local[k][0]+dir[i][0];  
290                 y=local[k][1]+dir[i][1];  
291                 z=screen[x][y];  
292                 if(z!=k&&!map[k][z])  
293                 {  
294                     map[k][z]=1;  
295                     indegree[z]++;  
296                 }  
297             }  
298         }  
299         if(topo()) 
300         printf("THESE WINDOWS ARE CLEAN\n"); 
301         else  
302         printf("THESE WINDOWS ARE BROKEN\n");
303     }  
304     return 0;  
305 }  
306 
307 
308 /*F*/
309 #include<cstdio>
310 #include<cstring>
311 int map[110][110];
312 int indegree[110];
313 void inin(){
314     memset(map,0,sizeof(map));
315     memset(indegree,0,sizeof(indegree));
316 }
317 void topo(int n)
318 {
319     int i,j,m,t=0;
320     int queue[110];
321     for(j=1;j<=n;j++){
322         for(i=1;i<=n;i++){
323             if(indegree[i]==0){//找出前驱数量为零的的点即每次找到第一名 
324                 m=i;break;
325             }
326         }
327         queue[t++]=m;indegree[m]=-1;//将第一名的前驱数量设为-1 
328         for(i=1;i<=n;++i){//第二步将前驱中含有第一名的点前驱数量减1 
329             if(map[m][i])indegree[i]--;
330         }
331     }
332     for(i=0;i<n;++i){
333         printf("%d ",queue[i]);
334     }
335     printf("\n");
336 }
337 int main(){
338     int n,i,p;
339     while(scanf("%d",&n)!=EOF){
340         inin();
341         for(i=1;i<=n;i++){
342              while(scanf("%d",&p),p){
343                 map[i][p]=1;
344                 indegree[p]++;
345              }
346              }
347           topo(n);    
348          }
349      return 0;   
350     }
View Code

 

/*hdu1285--采用二维数组记录两者之间的关系*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int map[510][510];//前驱数量 
int indegree[510];
int queue[510];//保存拓扑序列 
void topo(int n)
{
    int i,j,m,t=0;
    for(j=1;j<=n;j++)
	{
        for(i=1;i<=n;i++)
		{
            if(indegree[i]==0)	//找出前驱数量为零的的点即每次找到第一名 
			{
	            m=i;break;
            }
        }
        queue[t++]=m;indegree[m]=-1;//将第一名的前驱数量设为-1 
        for(i=1;i<=n;++i)//第二步将前驱中含有第一名的点前驱数量减1 
		{
            if(map[m][i])indegree[i]--;
        }
    }
    printf("%d",queue[0]);//输出拓扑序列 
    for(i=1;i<n;++i)
	{
        printf(" %d",queue[i]);
    }
    printf("\n");
}
int main()
{
    int n,m,i,j,a,b;
    while(scanf("%d%d",&n,&m)!=EOF)
	{
        memset(indegree,0,sizeof(indegree));//初始化 
        memset(map,0,sizeof(map));
        for(i=0;i<m;++i)
		{
            scanf("%d%d",&a,&b);
            if(map[a][b]==0)//避免重复的数据输入 
			{ 
                map[a][b]=1;indegree[b]++;//第一步记录关系和点的前驱数量 
            }
        }
        topo(n);//调用拓扑排序 
    }
    return 0;
}

/*hdu1285--采用邻接表记录两者之间的关系*/ 
#include<cstdio>
#include<cstring>
int head[510];
int indegree[510];
int queue[510];
int num;
struct stu{
   int to,next;
}edge[2510];
void inin(){//初始化 
    memset(indegree,0,sizeof(indegree)); 
	memset(head,-1,sizeof(head));
	num=0;
}
void add(int a,int b){//添加边 
   stu E={b,head[a]};
   edge[num]=E;
   head[a]=num++;
   indegree[b]++;
}
void topo(int n){
	int i,j,id,t=0;
    for(j=1;j<=n;j++){
    	for(i=1;i<=n;i++){
    		if(indegree[i]==0){
    		  id=i;
			  break;	
    		}
    	}
    	queue[t++]=id;indegree[id]=-1;
    	for(i=head[id];i!=-1;i=edge[i].next){
    		int k=edge[i].to;
			indegree[k]--;
    	}
    }
	printf("%d",queue[0]);//输出拓扑序列 
    for(i=1;i<n;++i){
        printf(" %d",queue[i]);
    }
    printf("\n");
}
int main(){
	int n,m,i,j,a,b;
	while(scanf("%d%d",&n,&m)!=EOF){
		inin();
		for(i=1;i<=m;i++){
		   scanf("%d%d",&a,&b);
		   add(a,b);
		}
		topo(n);
	}
	return 0;
}

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include <functional> 
using namespace std;
int map[510][510];
int indegree[510]; 
void topo(int n)
{
    int i,j,m,t=0;
    priority_queue<int,vector<int>,greater<int> >Q;//按从小到大顺序输出队
    for(i=1;i<=n;i++){
        if(indegree[i]==0){
             Q.push(i);
        }
    }
    int sign=1;
    while(!Q.empty()){
    	int top=Q.top();
		Q.pop();
    	indegree[top]=-1;
    	if(sign)
    		printf("%d",top);
    	else
    		printf(" %d",top);
    	sign=0;
        for(i=1;i<=n;i++){
    		if(map[top][i]){
    			indegree[i]--;
    			if(indegree[i]==0){
    				Q.push(i);
				}
			}
		}
    }
    printf("\n");
}
int main()
{
    int n,m,i,j,a,b;
    while(scanf("%d%d",&n,&m)!=EOF){
        memset(indegree,0,sizeof(indegree));
        memset(map,0,sizeof(map));
        for(i=0;i<m;++i){
            scanf("%d%d",&a,&b);
            if(map[a][b]==0){
                map[a][b]=1;indegree[b]++;
            }
        }
        topo(n);
    }
    return 0;
}

  

posted @ 2016-08-05 11:47  菜鸟龙*  阅读(168)  评论(0编辑  收藏  举报