码迷,mamicode.com
首页 > 其他好文 > 详细

freewriting(in 51 days)

时间:2017-09-22 01:02:42      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:php   efi   记录   span   nbsp   acm   using   gif   连通   

今天整个晚自习又基本迷到tarjan里去了(现在还没搞清楚遍历,更新的次序,于是就还没写tarjan算法),看来图论的部分可能这一周能进行完就不错了(不过我每次都高估我自己)。今天有些匆忙,回宿舍还有一堆作业(看来今晚就不用睡了。。。还怎么没看过乌鲁木齐的日出呢。。。)。物理开始了磁场的新章节,虽然以前物竞的时候讲过,但有些都忘了。看近期能否把这一章的册子提前做完(划拉完。。)吧,这样就能腾出时间来机房了(自己进行算法的内容还真是比较耗时间,有时候1个多小时还不一定能调出一个算法,不过倒还挺享受这个过程的,就是眼睛有些酸痛)。至于跑步。。。以后还是不再提它了。。。反正只是嘴上说说<( ̄ ﹌  ̄)>  

一.生成树性质

  • 一条边是连接图中某个非空非全集的点集合和其补集(好像就是两个没有连通的集合)中所有的边的最小边,那么这条边在最小生成树之中。(应该是kruskal算法过程的原理吧)
  • 各边权均不相同的图如果有回路,那回路中的最大边一定不在最小生成树之中。(回路中若有n个点,那么一定最多有n-1个点在最小生成树之中,那么贪心的话,那条最长的边一定不在最小生成树中)
  • 最小瓶颈生成树:使最大边权值尽量小的生成树(because of kruskal 的过程,最小生成树每次都贪最小的边,那么最小生成树就是一棵最小瓶颈生成树)
  • 最小瓶颈路:理由同↑,在最小生成树中a到b的路径就是a到b的最小瓶颈路(如果只求一次,听说用spfa变形更快)

二.拓扑排序(对于一个DAG(有向无环图),求点的排序,使得排在后面的点不能通过一条路径到前面的点。)

  例子:hdu-1285 http://acm.hdu.edu.cn/showproblem.php?pid=1285  (代码已ac)

  用de数组记录被赢(即被指向)的次数,每次寻找没有被赢的队伍(即类比为没有被路指向的点),输出,再将它从点集中剔除,即将它所战胜的队伍的de值减1,再循环。

  题中注意有多组数据,每行输出最后没有block(我就因为这两个原因wa和re了)

  个人认为拓扑排序中可以加一步去判断是否含DAG(即de数组均大于0)

技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 using namespace std;
 5 #define maxn 501
 6 int n,m,de[maxn],nvis;
 7 bool map[maxn][maxn],vis[maxn],blok;
 8 queue<int>q;
 9 void init(){
10     memset(vis,0,sizeof(vis));
11     memset(de,0,sizeof(de));
12     nvis=0;
13     blok=0;
14     memset(map,0,sizeof(map));
15     return;
16 }
17 int main(){
18     while(scanf("%d",&n)!=EOF){
19     scanf("%d",&m);
20     init();
21     for(int i=1;i<=m;++i){
22         int s,e;
23         scanf("%d%d",&s,&e);
24         if(!map[s][e]){
25             map[s][e]=1;
26             de[e]++;
27         }
28     }
29     while(nvis!=n){
30         for(int i=1;i<=n;++i){
31             if(de[i]==0&&vis[i]==0){
32                 if(!blok){
33                     blok=1;
34                 }
35                 else{
36                     printf(" ");
37                 }
38                 printf("%d",i);
39                 nvis++;
40                 vis[i]=1;
41                 if(nvis==n)goto end;
42                 q.push(i);
43                 break;
44             }
45         }
46         while(!q.empty()){
47             int pt=q.front();
48             q.pop();
49             for(int i=1;i<=n;++i){
50                 if(map[pt][i]==1&&vis[i]==0){
51                     map[pt][i]=0;
52                     de[i]--;
53                 }
54             }
55         }
56     }
57 end:printf("\n");
58     }
59     return 0;
60 }
(点击‘+‘查看)拓扑排序

 

freewriting(in 51 days)

标签:php   efi   记录   span   nbsp   acm   using   gif   连通   

原文地址:http://www.cnblogs.com/hobeter/p/7571413.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!