标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5788 Accepted Submission(s): 2678
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define N 150 6 struct Edge{ 7 int to; 8 int next; 9 }edge[N]; 10 int head[N]; 11 int Enct; 12 int in[N]; 13 void init() 14 { 15 Enct = 0; 16 memset(head,-1,sizeof(head)); 17 memset(in,0,sizeof(in)); 18 } 19 void add(int from , int to ) 20 { 21 edge[Enct].to = to; 22 edge[Enct].next = head[from]; 23 head[from]= Enct++; 24 } 25 int que[N]; 26 int n; 27 bool ph() 28 { 29 int c = 0; 30 for(int i = 0 ; i < n ;i++) 31 { 32 if(in[i]==0) que[c++] = i; 33 } 34 for(int i = 0 ; i < c; i++) 35 { 36 for(int j = head[que[i]] ; j!=-1; j= edge[j].next) 37 { 38 Edge e = edge[j]; 39 in[e.to]--; 40 if(in[e.to]==0) 41 que[c++] = e.to; 42 } 43 } 44 //printf("c = %d\n",c); 45 if(c<n-1) return false ; 46 else return true; 47 } 48 int main() 49 { 50 int m ; 51 while(~scanf("%d%d",&n,&m)&&(n!=0||m!=0)) 52 { 53 init(); 54 for(int i = 0 ;i < m ;i++) 55 { 56 int a , b; 57 scanf("%d%d",&a,&b); 58 add(a,b); 59 in[b]++; 60 } 61 if(ph()) printf("YES\n"); 62 else printf("NO\n"); 63 } 64 65 return 0; 66 }
下面是dfs超时的代码
1 //这种遍历所有路径的方法一般会超时,真的超时了,嘎嘎 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 #define N 150 7 int vis[N]; 8 int n ; 9 struct Edge{ 10 int to ; 11 int next; 12 }edge[N]; 13 int head[N]; 14 int Enct; 15 void init() 16 { 17 Enct = 0; 18 memset(head,-1,sizeof(head)); 19 memset(vis,0,sizeof(vis));//标记0为未访问 20 } 21 void add(int from , int to ) 22 { 23 edge[Enct].to = to; 24 edge[Enct].next = head[from]; 25 head[from] = Enct++; 26 } 27 /*bool dfs(int i ) 28 { 29 if(vis[i]) return false; 30 vis[i] = 1; 31 printf("vis[%d] = %d\n",i,vis[i]); 32 for(int j = head[i] ; j!=-1; j = edge[j].next) 33 { 34 Edge e = edge[j]; 35 dfs(e.to); 36 } 37 return true; 38 }*/ 39 bool tm = true; 40 bool dfs(int i ) 41 { 42 vis[i]=1; 43 for(int j = head[i] ; j!=-1 ;j = edge[j].next) 44 { 45 Edge e = edge[j]; 46 if(vis[e.to]==1) tm = false; 47 else 48 { 49 dfs(e.to); 50 vis[e.to]=0;//保证dfs走的是一条链,每次回溯的时候相当于走反向所以标记成未访问 51 } 52 } 53 return tm; 54 } 55 int main() 56 { 57 int m ; 58 while(~scanf("%d%d",&n,&m)&&(n!=0||m!=0)) 59 { 60 init(); 61 tm = true; 62 for(int i =0 ;i < m ;i++) 63 { 64 int a ,b; 65 scanf("%d%d",&a,&b); 66 add(a,b); 67 } 68 bool flag = true; 69 for(int i= 0; i < n ;i++) 70 { 71 if(flag == false) break; 72 if(vis[i]==0) 73 flag = dfs(i); 74 } 75 if(flag) printf("YES\n"); 76 else printf("NO\n"); 77 } 78 return 0; 79 }
标签:
原文地址:http://www.cnblogs.com/shanyr/p/4695294.html