Stanford 算法 part II:第一周编程题

来源:互联网 发布:js定义map 编辑:程序博客网 时间:2024/05/14 07:16

本周编程题没写,故转载别人的答案以作记录
答案转自:http://blog.csdn.net/zhaoxinfan/article/details/9713517
(比我写的好太多了。。。)

#include <iostream>  #include <fstream>  #include <cstdio>  #include <vector>  #define N 875714  using namespace std;  struct node{          bool visited;          int leader;          int finish;          vector<int> linkedVertices;          vector<int> rLinkedVertices;  };  struct node G[N+1];  struct node newG[N+1];//存放修改后的图,下面有问题要问到这个  int t=0;  int s=0;  void dfs(node G[], int i, bool reverse){          G[i].visited=true;          G[i].leader=s;          vector<int> next;          if (reverse) next= G[i].rLinkedVertices;          else next= G[i].linkedVertices;          for(int j=0; j<next.size(); j++){                  if(!G[next[j]].visited) {                          dfs(G, next[j], reverse);                  }          }          t++;          G[i].finish=t;          }  void dfs_loop(node G[], bool reverse){          t=0;          s=0;          for(int i=N;i>0;--i){                  if (!G[i].visited){                          s=i;                          dfs(G,i,reverse);                  }          }  }  int main(){          for(int i=1;i<=N;++i){                  G[i].visited=false;          }          FILE* fp=freopen("SCC.txt","r",stdin);          int head, tail;          while (scanf("%d %d", &head, &tail) > 0) {                        G[head].linkedVertices.push_back(tail);                        G[tail].rLinkedVertices.push_back(head);          }          fclose(fp);          dfs_loop(G, true);//FIRST LOOP          for(int i=1;i<=N;++i){                  newG[i].visited=false;                  newG[i].finish=0;                  newG[i].leader=0;                  vector<int> temp;                  for(int j=0; j< G[i].linkedVertices.size(); j++){                          temp.push_back(G[G[i].linkedVertices[j]].finish);                  }                  newG[G[i].finish].linkedVertices=temp;          }          dfs_loop(newG,false);//SECOND LOOP          ofstream ofs("stat.txt", ofstream::out);                  for (int k=1;k<=N;k++) ofs<< newG[k].leader<<endl;          ofs.close();          return 0;  }  
阅读全文
0 0
原创粉丝点击