1002 图论专练 解题报告
2016-10-05 21:59
176 查看
T1 重量不同的硬币
有N(1 <= N <= 1,000)个硬币,编号为1..N。
给出W(1 <= W <= 3,000)个推断对(A,B),表示硬币A比硬币B重。
寻找并输出一个硬币编号,要求其重量明确不同于其他硬币的个数最多。如果有多个答案,输出编号最小的一个。如果给出的数据有矛盾,输出"IMPOSSIBLE"
PROBLEM NAME: coins
INPUT FORMAT:
* Line 1: 两个整数: N and W.
* Lines 2..W+1: 每行两个整数: A, B
OUTPUT FORMAT:
* Line 1: 重量不同于其他硬币的个数最多的硬币编号。
【题解】
根据题意建图,注意正反图都要建(蒟蒻考试时没有建反图,挂掉)
如果图中有环,显然是"IMPOSSIBLE",所以先用tarjan判环。
然后两遍dfs遍历,找到每个结点的子树大小,输出最大的编号就行了。
View Code
有N(1 <= N <= 1,000)个硬币,编号为1..N。
给出W(1 <= W <= 3,000)个推断对(A,B),表示硬币A比硬币B重。
寻找并输出一个硬币编号,要求其重量明确不同于其他硬币的个数最多。如果有多个答案,输出编号最小的一个。如果给出的数据有矛盾,输出"IMPOSSIBLE"
PROBLEM NAME: coins
INPUT FORMAT:
* Line 1: 两个整数: N and W.
* Lines 2..W+1: 每行两个整数: A, B
OUTPUT FORMAT:
* Line 1: 重量不同于其他硬币的个数最多的硬币编号。
【题解】
根据题意建图,注意正反图都要建(蒟蒻考试时没有建反图,挂掉)
如果图中有环,显然是"IMPOSSIBLE",所以先用tarjan判环。
然后两遍dfs遍历,找到每个结点的子树大小,输出最大的编号就行了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<ctime> 7 #include<algorithm> 8 #include<queue> 9 using namespace std; 10 #define INF 1000000000 11 #define MAXN 1010 12 #define mod ((1<<31)-1) 13 struct node1{long long y,next,v;}e[MAXN*MAXN]; 14 struct node2{long long id,v;}dis[MAXN]; 15 long long n,m,len,ans=1,Link[MAXN],vis[MAXN],q[MAXN],map[MAXN][MAXN]; 16 inline long long read() 17 { 18 long long x=0,f=1; char ch=getchar(); 19 while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();} 20 while(isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();} 21 return x*f; 22 } 23 void insert(long long x,long long y,long long v) {e[++len].next=Link[x];Link[x]=len;e[len].y=y;e[len].v=v;} 24 bool cmp(node2 a,node2 b) {return a.v<b.v;} 25 void spfa() 26 { 27 for(long long i=1;i<=n;i++) dis[i].id=i,dis[i].v=INF; 28 long long head=0,tail=1; 29 q[1]=1; vis[1]=1; dis[1].v=0; 30 while(++head<=tail) 31 { 32 long long x=q[head]; 33 for(long long i=Link[x];i;i=e[i].next) 34 { 35 if(dis[x].v+e[i].v<dis[e[i].y].v) 36 { 37 dis[e[i].y].v=dis[x].v+e[i].v; 38 if(!vis[e[i].y]) 39 { 40 q[++tail]=e[i].y; 41 vis[e[i].y]=1; 42 } 43 } 44 } 45 vis[x]=0; 46 } 47 } 48 int main() 49 { 50 freopen("castle.in","r",stdin); 51 freopen("castle.out","w",stdout); 52 n=read(); m=read(); 53 memset(map,10,sizeof(map)); 54 for(long long i=1;i<=m;i++) 55 { 56 long long x=read(),y=read(),v=read(); 57 insert(x,y,v); insert(y,x,v); 58 map[x][y]=min(map[x][y],v); 59 map[y][x]=map[x][y]; 60 } 61 spfa(); 62 sort(dis+1,dis+n+1,cmp); 63 for(long long i=2;i<=n;i++) 64 { 65 long long temp=0; 66 for(long long j=1;j<i;j++) 67 { 68 long long x=dis[i].id,y=dis[j].id; 69 if(dis[i].v==dis[j].v+map[x][y]) temp++; 70 } 71 ans=ans*temp%mod; 72 } 73 printf("%d\n",ans); 74 return 0; 75 }
View Code
相关文章推荐
- POJ 1002题 解题报告
- OpenJudge / POJ 1002 487-3279 解题报告 C++
- BestCoder7 1002 Little Pony and Alohomora Part I(hdu 4986) 解题报告
- zoj 1002解题报告
- 图论专题测试 【最短路】【网络流】解题报告
- BZOJ 2079 [Poi 2010] 图论 解题报告
- zoj1002 深搜题解题报告
- pku 1002 解题报告
- YT02-简单数学课后题-1002 Delta-wave -(5.31日-烟台大学ACM预备队解题报告)
- BestCoder10 1002 Revenge of GCD(hdu 5019) 解题报告
- zoj 1002解题报告
- [POJ 1002] 487-3279 C++解题报告
- HDOJ 1002 A + B Problem II 简单解题报告
- 【算法学习笔记】24.记忆化搜索 解题报告 SJTU OJ 1002 二哥种花生
- poj图论解题报告索引
- luogu解题报告:P1262间谍网络【代码量惊人】【图论/强连通缩点】
- zoj 1002解题报告
- poj1002 487-3279 解题报告
- poj1002 解题报告
- HDU4786 Fibonacci Tree 解题报告 【图论】【Kruskal】