Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
寻大侠赐教!TLE了无数次,不知道怎么办了。这是我的代码,强连通分连缩点后,拓扑排序,但就是TLE! #include<stdio.h> #include<stdlib.h> #include<string.h> struct node { int id; node *next; }edge1[60001],//原图 edge2[6001],//无向图 edge3[6001];//逆图 struct ARC{ int u,v; }arc[6001]; int n,m,tot,top,label,flag,mem[6001],mark[6001],indegree[6001],hashtable[1000001][2]; bool vis[1000001]; void insert(int a,int b){ node *s=new node;node *t=new node;node *p=new node;node *q=new node; s->id=b;t->id=a; p->id=a;q->id=b; s->next=edge1[a].next;t->next=edge2[b].next; p->next=edge3[b].next;q->next=edge3[a].next; edge1[a].next=s;edge2[b].next=t;edge3[a].next=q;edge3[b].next=p; } void check(int t){//检查无向图的连通性 tot++;vis[t]=true; node *ptr=edge3[t].next; while(ptr){ if(!vis[ptr->id]) check(ptr->id); ptr=ptr->next; } } void dfsR(int t){//对逆图dfs vis[t]=true; node *ptr=edge2[t].next; while(ptr){ if(!vis[ptr->id]) dfsR(ptr->id); ptr=ptr->next; } mem[++top]=t; } void dfs(int t){//标记强连通分量 mark[t]=label; vis[t]=true; node *ptr=edge1[t].next; while(ptr){ if(!vis[ptr->id]) dfs(ptr->id); ptr=ptr->next; } } int hashf(int a,int b){//hash int tmp=(a*131313+b*13131+a*b)%100001; while(!vis[tmp] && !(hashtable[tmp][0]==a&&hashtable[tmp][1]==b)) return tmp; } int main(){ int i,t,a,b; scanf("%d",&t); while(t--){ memset(edge1,0,sizeof(edge1)); memset(edge2,0,sizeof(edge2)); memset(edge3,0,sizeof(edge3)); scanf("%d%d",&n,&m); for(i=1;i<=m;i++){ scanf("%d%d",&a,&b); arc[i].u=a;arc[i].v=b; insert(a,b); } tot=0; memset(vis,false,sizeof(vis)); check(1);//检查连通性 if(tot!=n) {printf("No\n");continue;} memset(vis,false,sizeof(vis)); top=0; for(i=1;i<=n;i++){ if(!vis[i]) dfsR(i);//对逆图dfs } memset(vis,false,sizeof(vis)); label=0; for(i=top;i>0;i--){//标记连通分量 label++; dfs(mem[i]); } memset(indegree,0,sizeof(indegree)); memset(vis,false,sizeof(vis)); memset(edge1,0,sizeof(edge1)); for(i=1;i<=m;i++){//重建图 a=mark[arc[i].u];b=mark[arc[i].v]; if(a!=b){ int tmp=hashf(a,b); if(!vis[tmp]){ node *s=new node; s->id=b;s->next=edge1[a].next; indegree[b]++; vis[tmp]=true; hashtable[tmp][0]=a;hashtable[tmp][1]=b; } } } top=0;flag=0; for(i=1;i<=label && top<=1;i++) if(!indegree[i]) mem[++top]=i; if(top>1) {printf("No\n");continue;} while(top){//拓扑排序,如果有分支就不满足 int tmp=mem[top--]; node *ptr=edge1[tmp].next; while(ptr){ indegree[ptr->id]--; if(!indegree[ptr->id]) mem[++top]=ptr->id; ptr=ptr->next; } if(top>=1){flag=1;break;} } if(flag) printf("No\n"); else printf("Yes\n"); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator