2066 三角恋
2066 三角戀
?
?時間限制: 1 s ?空間限制: 128000 KB ?題目等級 : 鉆石 Diamond 題解 ?查看運行結果 題目描述?Description人們的戀愛關系與如下特點:兩個人a,b,如果a愛著b,那么b一定不愛a;如果a不愛b,那么b一定愛著a(yh的研究成果果然與眾不同……)。
現在,yh想知道,在n個人當中,是否存在三角戀現象(即a愛著b,b愛著c,c愛著a)。
輸入描述?Input Description本題有多組測試數據
第一行一個整數t,表示有t組測試數據。
對于每組數據,第一行為一個整數n,表示共有n人。
接下來為n*n的0,1矩陣a,如果a[i,j]=1,則i愛著j,否則表示i不愛j;數據保證a[i,j]<>a[j,i]。
輸出描述?Output Description每組數據輸出一行,如果存在三角戀,輸出’Yes’,否則輸出’No’。
樣例輸入?Sample Input2
5
00100
10000
01001
11101
11000
5
01111
00000
01000
01100
01110
樣例輸出?Sample OutputYes
No
數據范圍及提示?Data Size & Hint對于40%的數據,n≤10
對于100%的數據,n≤2000,?t≤5
?
tarjan算法
#include<cstdio> #include<iostream> #include<stack> #include<vector> #include<cstring> #define M 2016 using namespace std; vector<int> grap[M]; stack<int> s; char ch[M]; int low[M],num[M],vis[M],instack[M],map[M][M],f[M],n,cnt,tot; void tarjan(int v) {low[v]=num[v]=++tot;s.push(v);instack[v]=1;vis[v]=1;for(int i=0;i<grap[v].size();i++){int w=grap[v][i];if(!vis[w]){tarjan(w);low[v]=min(low[v],low[w]);}else if(instack[w])low[v]=min(low[v],num[w]);}int u;if(low[v]==num[v]){++cnt;do{u=s.top();f[cnt]++;s.pop();instack[u]=0;}while(u!=v);} } void init(){int x;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",ch);for(int j=1;j<=n;j++)map[i][j]=(int)ch[j-1]-'0';}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(map[i][j]==1)grap[j].push_back(i);for(int i=1;i<=n;i++)if(!vis[i])tarjan(i);if(cnt<n)printf("Yes\n");else printf("No\n");for(int i=1;i<=n;i++)grap[i].clear(); } int main(){int t;scanf("%d",&t);for(int i=1;i<=t;i++){cnt=0;memset(vis,0,sizeof(vis));memset(low,0,sizeof(low));memset(num,0,sizeof(num));memset(instack,0,sizeof(instack));memset(f,0,sizeof(f));init();}return 0; }?
?
轉載于:https://www.cnblogs.com/shenben/p/5540556.html
總結
- 上一篇: hibernate 中id生成策略
- 下一篇: jquery模糊查询